2013-07-08 2 views
0

У меня есть ImageView и 3 TextView внутри встроенного макета, и вам нужно размещать текстовые представления во время выполнения в зависимости от размера изображения. На данный момент я использую ViewTreeObserver на изображении, чтобы я мог использовать его ширину/высоту для размещения текстовых полей.Мерцание при перемещении представлений во время выполнения

Все работает отлично, за исключением того, что TextViews перепрыгивают в нужное место при загрузке, что делает его похожим на мерцание.

Есть ли способ переместить TextViews перед отображением экрана, но как только изображение будет иметь ширину и высоту?

Вот (упрощенный) вариант кода XML:

<RelativeLayout 
     android:id="@+id/relativeLayoutMain" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/myImage" 
     android:src="@drawable/myImageSrc" 
     android:adjustViewBounds="true" 
     android:scaleType="fitStart" 
     android:layout_alignParentStart="true"/> 
    <TextView 
     android:id="@+id/myTextView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="..." 
     android:layout_alignLeft="@+id/myImage" 
     android:layout_alignTop="@+id/myImage"/>  
</RelativeLayout> 

И вот код, я использую в функции обратного вызова addOnGlobalLayoutListener позиционировать вид текста во время выполнения:

RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.relativeLayoutMain); 

RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
int width = relativeLayout.getMeasuredWidth(); 
int height = relativeLayout.getMeasuredHeight(); 

TextView tv = (TextView) findViewById(R.id.myTextView); 
int w = tv.getMeasuredWidth(); 
int h = tv.getMeasuredHeight(); 
layoutParams.setMargins((int) (width * 0.5 - w/2), (int) (height * 0.54 - h/2), 0, 0); 
tv.setLayoutParams(layoutParams); 
+0

Да, есть! в XML-макете. Вы можете сделать это легко в своем xml. Просто отправьте свой XML-код макета, чтобы я мог помочь. –

+0

Я подозреваю, что вы просто хотите, чтобы ваш 'TextView' мог быть всегда ниже или выше 'ImageView'. Если это так, то это можно сделать в xml, но если есть что-то вроде размещения «TextView» для размещения A для размера x, но для размера y place B, которое совершенно иная, тогда это нужно делать во время выполнения. –

+0

Это должно быть последнее. Позиция зависит от размера ImageView, который известен только во время выполнения. Я действительно думал о том, чтобы скрывать TextView, пока они не находятся в правильном положении - это, по крайней мере, означало бы, что они не прыгают по местоположению. – Chris

ответ

0

Я предполагаю, что вы хотите, чтобы ваш TextView находился в центре ImageView. Вот как вы можете это сделать, вы можете добавить маржу к своему TextView, чтобы теперь настроить свою позицию.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/relativeLayoutMain" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" > 

<ImageView 
    android:id="@+id/myImage" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentStart="true" 
    android:adjustViewBounds="true" 
    android:scaleType="fitStart" 
    android:src="@drawable/ic_launcher" /> 

<TextView 
    android:id="@+id/myTextView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:text="..." /> 

</RelativeLayout> 
+0

Этот конкретный элемент хочет находиться в центре, но другие должны появиться в другом месте на изображении. На данный момент в коде я помещаю их в определенные проценты ширины и высоты. – Chris

+0

, тогда наилучший подход заключается в расширении 'RelativeLayout' и переопределении метода' onMeasure' и после вызова супер присваивать правильные позиции дочерним элементам. или простой способ - просто скрыть их, пока вы не разместите их правильно. Первый подход был бы легким для вас, если у вас есть опыт работы с пользовательскими представлениями. –

Смежные вопросы