Почему 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 11. Мне нужен способ сделать это на уровне API 10.
tvRotate.setRotation(180);//instead of the RotateAnimation, only works in API Level 11
tvRotate.setVisibility(View.INVISIBLE);
7 ответов
Для меня зовет clearAnimation
зрения исправили проблему. В моем случае я хотел вернуть View в исходное положение после выполнения перевода с fillAfter, установленным в true.
Все анимации (до android 3.0) фактически применяются к растровому изображению, которое представляет собой снимок вашего представления, а не первоначального представления. Когда вы устанавливаете для параметра fill after значение true, это фактически означает, что растровое изображение будет по-прежнему отображаться на экране вместо вашего просмотра. Это причина, почему видимость не изменится при использовании setVisibility
а также причина, по которой ваше представление не будет получать сенсорные события в новых (повернутых) границах. (но поскольку вы поворачиваетесь на 180 градусов, это не проблема).
Другой способ обойти это - обернуть ваш анимированный вид в другой вид и установить видимость этого вида-оболочки.
<?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);
Используйте это до setVisibility после завершения анимации:
anim.reverse();
anim.removeAllListeners();
anim.end();
anim.cancel();
где anim - ваш ObjectAnimator
но если вы используете класс Animation, то просто сделайте:
view.clearAnimation();
на вид, на котором была выполнена анимация
Я нашел обходной путь для этого: в основном, прямо перед вызовом setVisibility(View.GONE), сделайте анимацию с длительностью =0 setFillAfter(false) и установите угол от / до, чтобы установить текущий угол поворота.
Это очистит растровое изображение setFillAfter и позволит пропустить представление.
Я закончил тем, что требовал API уровня 11 и использовал setRotation для этого. Это кажется довольно простым требованием, которое не может быть выполнено заранее. Все, что я хотел сделать, это повернуть кнопку, а затем скрыть / показать ее.
tvRotate.setVisibility(View.INVISIBLE);
вместо того
tvRotate.alpha = 0f