2011-12-31 2 views
55

Почему текст не становится невидимым?Почему настройка setVisibility после анимирования представления?

Вот мой макет 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); 

ответ

18

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

+1

Итак, есть ли способ скрыть битм ap, который сохраняется после поворота? – ZippyFerguson

+0

та же проблема ... – SunnySonic

1

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

1

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

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

7

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

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

Именно то, что я искал :-) – Couitchy

151

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

+6

У меня была эта проблема, и я могу подтвердить, что clearAnimation делает трюк. –

+0

пожалуйста, кто-нибудь согласится с этим ответом, так как это тот, который спасает вас ** после Дней боев;) thx! –

+4

Я подтверждаю, что это устраняет проблему.Чтобы быть более полезным использовать его в 'onAnimationEnd()' в 'AnimationListener';) – czaku

5

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

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

где анит Ваш ObjectAnimator

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

view.clearAnimation(); 

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

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