为什么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);
答案 0 :(得分:159)
对我来说,调用View的clearAnimation
修复了问题。在我的情况下,我想在使用fillAfter设置为true进行翻译后将View设置回原始位置。
答案 1 :(得分:21)
所有动画(在android 3.0之前)实际上都应用于位图,而位图是视图的快照而不是原始视图。当您将填充设置为true后,这实际上意味着位图将继续显示在屏幕上而不是您的视图上。这就是为什么使用setVisibility
时可见性不会改变的原因,以及您的视图不会在其新(旋转)边界中接收触摸事件的原因。 (但是因为你在180度旋转不是问题)。
答案 2 :(得分:8)
解决此问题的另一种方法是将动画视图包装在另一个视图中,并设置该包装器视图的可见性。
<?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);
答案 3 :(得分:6)
动画完成后,在setVisibility之前使用此选项:
anim.reverse();
anim.removeAllListeners();
anim.end();
anim.cancel();
其中anim是你的ObjectAnimator
但如果您使用的是动画类,那么只需执行:
view.clearAnimation();
在执行动画的视图上
答案 4 :(得分:1)
我最终要求API级别11并使用setRotation来完成此任务。这似乎是一个非常简单的要求,虽然不能在蜂窝前完成。我想做的只是旋转一个按钮,然后隐藏/显示它。
答案 5 :(得分:1)
我想出了一个解决方法:基本上在调用setVisibility(View.GONE)之前,执行持续时间= 0 setFillAfter(false)的动画,并将角度从/设置为当前旋转角度。
这将清除setFillAfter位图并允许视图消失。