Подтвердить что ты не робот

Почему функция setVisibility не работает после просмотра анимированного представления?

Почему 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 Level 11. Мне нужен способ сделать это на уровне API 10.

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

Ответ 1

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

Ответ 2

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

Ответ 3

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

<?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);

Ответ 4

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

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

где anim - ваш ObjectAnimator

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

view.clearAnimation();

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

Ответ 5

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

Ответ 6

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

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