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

У меня есть TextView в FrameLayout следующим образом:

<FrameLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    ... >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:singleLine="true"
        ... />

Текст TextView задается в коде, и у меня есть анимация перевода, работающая в TextView, которая перемещает его влево по родительскому представлению следующим образом:

myTextView.setText(getVenueInformationText());
myTextView.setAnimation(AnimationUtils.loadAnimation(myContext, R.anim.slide_left_repeatedly));

Мне нужно учитывать оба случая, когда текст в TextView короче или шире, чем ширина родительского представления (в данном случае — FrameLayout). Однако я обнаружил, что ширина анимированного TextView всегда равна ширине FrameLayout (и, таким образом, мой текст обрезается).

Кто-нибудь знает, почему, когда я устанавливаю текст в своем TextView и устанавливаю анимацию, TextView появляется только тогда, когда ширина FrameLayout (даже если текст в TextView должен растягиваться, чтобы быть шире, чем FrameLayout)?

Примечание 1. Анимация выделения в TextView не подойдет для меня, поскольку текст в TextView может быть меньше ширины родительского представления (в этом случае анимация не запускается... и мне нужно, чтобы анимация запускалась независимо от ширины текста).

Примечание 2. Ниже приведено XML-определение анимации перевода, которую я использую:

 <translate
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:interpolator="@android:anim/linear_interpolator"
  android:fromXDelta="100%p"
  android:toXDelta="-100%"
  android:repeatCount="infinite"
  android:duration="15000" />

person Adil Hussain    schedule 30.01.2012    source источник
comment
Вы пытались использовать LinearLayout вместо FrameLayout?   -  person Adil Soomro    schedule 30.01.2012
comment
Ага. Но все равно радости нет...   -  person Adil Hussain    schedule 30.01.2012
comment
Посмотрите, работает ли это: stackoverflow.com/questions/3862409/   -  person AJcodez    schedule 30.01.2012
comment
Это не сработает. Смотрите примечание внизу моего вопроса. (Тем не менее благодарю за помощь.)   -  person Adil Hussain    schedule 30.01.2012
comment
Пожалуйста, ответьте на мой вопрос: что бы вы сделали, если бы ваш текст был больше ширины экрана?   -  person teoREtik    schedule 30.01.2012
comment
Независимо от ширины текста (т.е. даже если он короче или длиннее, чем ширина FrameLayout), я хочу запустить анимацию перевода (которая повторяет анимацию выделения), которая несколько раз перемещает TextView (или текст внутри него, если это возможно) влево ... как читатель новостей.   -  person Adil Hussain    schedule 30.01.2012


Ответы (2)


Решил это, поместив TextView в HorizontalScrollView (вместо FrameLayout или LinearLayout) следующим образом...

<HorizontalScrollView
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:paddingLeft="10dp"
  android:paddingRight="10dp"
  android:scrollbars="none" >
  <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:singleLine="true" />
</HorizontalScrollView>

... а затем задайте текст и анимацию TextView программно/динамически, как и раньше.

person Adil Hussain    schedule 08.03.2012
comment
Я реализовывал прокручиваемое текстовое представление и нашел эту очень полезную часть для моей окончательной реализации. Другие решения предлагали переопределить представления onMeasure в сочетании с AnimationListener, но использование ScrollView кажется гораздо более последовательным. - person ılǝ; 02.05.2014

Итак, как я правильно понимаю, вы хотите реализовать что-то вроде бегущей строки. В этом случае вы должны динамически загрузить некоторую информацию с хоста, преобразовать ее в String и установить в свой TextView.

Я бы сделал это таким образом: ваш TextView должен обернуть ваш контент по ширине (как минимум), затем вы используете стандартный TranslateAnimation, начиная с правой стороны родительского View и заканчивая (parentView.getLeft() - TextView.getWidth() - в этом случае ваш TextView будет быть скрытым), установите AnimationListener для этой анимации и в конце проверьте, есть ли какая-то новая информация из источника, которую вы можете установить как новое содержимое TextView, и снова запустите Animation.

person teoREtik    schedule 02.02.2012
comment
Спасибо за ответ teoREtik. См. примечание 2, которое я добавил к моему вопросу и которое, я считаю, делает именно то, что вы описали. Ширина TextView установлена ​​​​на wrap_content, анимация выполняется и многократно перемещает TextView слева направо. Проблема в том, что ширина TextView никогда не превышает ширину FrameLayout, даже если текст в TextView шире, чем у FrameLayout... - person Adil Hussain; 03.02.2012