视图animation之后为什么不设置可见性?

为什么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); 

对于我来说clearAnimation的视图解决了这个问题。 在我的情况下,我想在将fillAfter设置为true的情况下进行翻译之后,将视图设置回原始位置。

所有的animation(android 3.0之前)实际上是应用到一个位图,这是你的视图的快照,而不是你的原始视图。 当您将填充设置为true时,实际上意味着位图将继续显示在屏幕上而不是您的视图中。 这就是为什么在使用setVisibility时可见性不会改变的原因,也是为什么您的视图不会在其新的(旋转的)边界中接收触摸事件的原因。 (但是因为你在180度旋转,这不是问题)。

解决这个问题的另一种方法是将animation视图包装在另一个视图中,并设置该包装视图的可见性。

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

animation完成后,在setVisibility之前使用它:

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

哪里anim是你的ObjectAnimator

但是如果你正在使用Animation类,那么只需要:

 view.clearAnimation(); 

在执行animation的视图上

我最终要求API Level 11并使用setRotation来完成这个。 这似乎是一个非常简单的要求,但不能在Honeycomb之前完成。 我想要做的只是旋转一个button,然后隐藏/显示它。

我想出了一个解决方法:基本上就在你调用setVisibility(View.GONE)之前,做一个持续时间= 0的animationsetFillAfter(false),并将angular度从/设置为当前的旋转angular度。

这将清除setFillAfter位图,并允许视图消失。