动画[2]TweenAnimation 使用场景
【参考链接】
TweenAnimation常用于View的动画,
View
View提供了startAnimation()、cancelAnimation()用于开始、停止一个动画
还有setAnimation(),它只是设置Animation的启动时间并附加到View上,需要自己重绘触发开始动画,startAnimation()内部就是这样
ViewGroup
可以为ViewGroup指定layoutAnimation属性,这样当此ViewGroup被addView()添加到窗口上的时候,此ViewGroup中的子View就会以一定的动画形式出现。
以如下代码为例
1. 为LinearLayout指定layoutAnimation属性
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layoutAnimation="@anim/anim_ll"
>
2. anim_ll文件如下
<?xml
version="1.0"
encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/anim_item"
android:animationOrder="normal"
android:delay="0.5">
</layoutAnimation>
其中
animation指示每个子View的动画
animationOrder指示子View播放动画的顺序
delay指示每个子View播放动画的延时,系统默认子View入场动画的时间周期为300ms,那么0.5就表示第一个子View延时150ms开始播放动画,第二个子View延时300ms开始播放动画
3. 子View的入场动画anim_item如下
<?xml
version="1.0"
encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300"
android:interpolator="@android:anim/accelerate_interpolator"
android:shareInterpolator="true">
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0"
/>
<translate
android:fromXDelta="500"
android:toXDelta="0"
/>
</set>
当添加此LinearLayout的时候动画效果如下
上述效果也可以通过java代码setLayoutAnimation()来实现
ViewGroup inflate =(ViewGroup) getLayoutInflater().inflate(R.layout.linearlayout,
null);
Animation animation= AnimationUtils.loadAnimation(this,
R.anim.anim_item);
LayoutAnimationControllercontroller =
new
LayoutAnimationController(animation);
controller.setDelay(0.5f);
controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
inflate.setLayoutAnimation(controller);
Activity
在startActivity()和finish()时,会进行Activity的切换
Activity有默认的切换效果,但是这个效果我们是可以自定义的。主要通过overridePendingTransition()方法
public void overridePendingTransition(int enterAnim, int exitAnim)
enterAnim指定新打开的Activity要进行的动画,
exitAnim指定要关闭的Activity要进行的动画
我们可以在startActivity()或finish()方法后调用这个方法。如下
enter_anim,从下向上移动,从透明到不透明
<?xml
version="1.0"
encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300"
android:interpolator="@android:anim/accelerate_interpolator"
android:shareInterpolator="true"
>
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0"
/>
<translate
android:fromYDelta="500"
android:toYDelta="0"/>
</set>
exit_anim,从上向下移动,从不透明到透明
<?xml
version="1.0"
encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300"
android:interpolator="@android:anim/accelerate_interpolator"
android:shareInterpolator="true"
>
<alpha
android:fromAlpha="1.0"
android:toAlpha="0"
/>
<translate
android:fromYDelta="0"
android:toYDelta="500"
/>
</set>
在前一个Activity打开后一个Activity时,在startActivity()后调用overridePendingTransition(R.anim.enter_anim,R.anim.exit_anim);
前一个Activity会执行exit动画,后一个Activity会执行enter动画
public void
start(View view){
Intent intent = new
Intent(this,
SecondActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.enter_anim,
R.anim.exit_anim);
}