Почему setVisibility не работает после того, как представление анимировано? - PullRequest
63 голосов
/ 31 декабря 2011

Почему textView не становится невидимым?

Вот мой макет xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
    android:id="@+id/tvRotate"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Rotate Me"
/>
</LinearLayout>

.. а вот моя деятельность:

public class RotateMeActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView tvRotate = (TextView) findViewById(R.id.tvRotate);

        RotateAnimation r = new RotateAnimation(0, 180, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        r.setDuration(0);
        r.setFillAfter(true);
        tvRotate.startAnimation(r);
        tvRotate.setVisibility(View.INVISIBLE);
    }
}

Моя цель состоит в том, чтобы повернуть представление, а затем иметь возможность скрыть и показать его в коде, установив setVisibility.Следующее работает, но setRotation доступно только в API уровня 11. Мне нужен способ сделать это в API уровня 10.

tvRotate.setRotation(180);//instead of the RotateAnimation, only works in API Level 11
tvRotate.setVisibility(View.INVISIBLE);

Ответы [ 6 ]

160 голосов
/ 27 марта 2012

Для меня вызов clearAnimation из View исправил проблему.В моем случае я хотел вернуть View в исходное положение после выполнения перевода с fillAfter, установленным в true.

21 голосов
/ 31 декабря 2011

Все анимации (до android 3.0) фактически применяются к растровому изображению, которое представляет собой снимок вашего вида, а не исходного.Когда вы устанавливаете для параметра fill after значение true, это фактически означает, что растровое изображение будет по-прежнему отображаться на экране вместо вашего просмотра.Это причина, по которой видимость не изменится при использовании setVisibility, а также причина, по которой ваше представление не будет получать сенсорные события в новых (повернутых) границах.(но поскольку вы поворачиваетесь на 180 градусов, это не проблема).

8 голосов
/ 26 февраля 2012

Другой способ обойти это - обернуть ваш анимированный вид в другой вид и установить видимость этого вида-оболочки.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="vertical" >
    <FrameLayout 
        android:id="@+id/animationHoldingFrame"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <TextView
             android:id="@+id/tvRotate"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="Rotate Me"
        />
    </FrameLayout>
</LinearLayout>

И код становится таким:

TextView tvRotate = (TextView) findViewById(R.id.tvRotate);
FrameLayout animationContainer = (FrameLayout)findViewById(R.id.animationHoldingFrame)

RotateAnimation r = new RotateAnimation(0, 180, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
r.setDuration(0);
r.setFillAfter(true);
tvRotate.startAnimation(r);
animationContainer.setVisibility(View.INVISIBLE);
6 голосов
/ 20 мая 2016

Используйте это до setVisibility после завершения анимации:

anim.reverse();
anim.removeAllListeners();
anim.end();
anim.cancel();

где anim - ваш ObjectAnimator

но если вы используете класс Animation, тогда просто выполните:

view.clearAnimation();

в представлении, на котором была выполнена анимация

1 голос
/ 25 января 2012

Я нашел обходной путь для этого: в основном, прямо перед вызовом setVisibility (View.GONE), сделайте анимацию с длительностью = 0 setFillAfter (false) и установите угол от / до, чтобы установить текущий угол поворота.

Это очистит растровое изображение setFillAfter и позволит пропустить представление.

1 голос
/ 02 января 2012

В итоге мне потребовался уровень API 11 и я использовал setRotation для этого. Это кажется довольно простым требованием, которое не может быть выполнено заранее. Все, что я хотел сделать, это повернуть кнопку, а затем скрыть / показать ее.

...