1、本质:确定开始和结束视图样式,中间动画变化过程由系统补全。
2、作用对象:视图控件(View):TextView、ImageView 等。
3、优点:简单、方便;缺点:只能作用在视图控件;不能改变视图控件的属性;动画效果相对简单。
4、分类:平移(translate)、旋转(rotate)、缩放(scale)、透明度(alpha)。
5、具体使用
- 平移动画(TranslateAnimation 动态创建)
<?xml version="1.0" encoding="utf-8"?>
<!--无限往返平移动画效果-->
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000" // 动画持续时间(ms)
android:startOffset ="1000" // 动画延迟开始时间(ms)
android:fillBefore = "true" // 动画播放完后,视图是否停留在动画开始的状态,默认 true
android:fillAfter = "true" // 动画播放完后,视图是否停留在动画结束的状态,优先于 fillBefore 值,默认为false
android:fillEnabled= "false" // 是否应用 fillBefore 值,对 fillAfter 值无影响,默认为true
android:repeatMode= "reverse" // 重复播放动画模式,restart代表正序重放,reverse代表倒序回放,默认为 restart
android:repeatCount = "infinite" // 重放次数(动画的播放次数= 重放次数+1),为infinite时无限重复
android:interpolator = "@null" // 插值器,即影响动画的播放速度
android:fromXDelta="0" // 视图在水平方向x 移动的起始值,
android:toXDelta="500" // 视图在水平方向x 移动的结束值
android:fromYDelta="0" // 视图在竖直方向y 移动的起始值
android:toYDelta="500"> // 视图在竖直方向y 移动的结束值
</translate>
注:android:xxxDelta 为具体值 “1” = 视图自身左上角 + 1 px;百分比 “200%” = 视图自身左上角 + 自身宽/高度*200%;parent “50p” = 视图自身左上角 + 父控件宽/高*50%
// 创建动画对象
Animation translateAnimation = AnimationUtils.loadAnimation(this, R.anim.translate_anim);
// 播放动画
btn_translate.startAnimation(translateAnimation);
- 旋转动画(RotateAnimation 动态创建)
<?xml version="1.0" encoding="utf-8"?>
<!--无限往返旋转动画-->
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000"
android:startOffset ="1000"
android:fillBefore = "true"
android:fillAfter = "true"
android:fillEnabled= "false"
android:repeatMode= "reverse"
android:repeatCount = "infinite"
android:interpolator = "@null"
android:fromDegrees="0" // 动画开始时 视图的旋转角度(正数 = 顺时针,负数 = 逆时针)
android:toDegrees="360" // 动画结束时 视图的旋转角度(正数 = 顺时针,负数 = 逆时针)
android:pivotX="50%" // 旋转轴点的x坐标
android:pivotY="50%" // 旋转轴点的y坐标
>
注:android:pivotX/Y 为具体值 “1” = 视图自身左上角 + 1 px;百分比 “200%” = 视图自身左上角 + 自身宽/高度*200%;parent “50p” = 视图自身左上角 + 父控件宽/高度*50%
</rotate>
Animation rotateAnimation=AnimationUtils.loadAnimation(this,R.anim.rotate_anim);
btn_rotate.startAnimation(rotateAnimation);
- 缩放动画(ScaleAnimation 动态创建)
<?xml version="1.0" encoding="utf-8"?>
<!--无限往返缩放动画-->
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000"
android:startOffset ="1000"
android:fillBefore = "true"
android:fillAfter = "true"
android:fillEnabled= "false"
android:repeatMode= "reverse"
android:repeatCount = "infinite"
android:interpolator = "@null"
android:fromXScale="1" // 0.0表示收缩到没有,1.0表示正常无伸缩,<1 缩小,>1 放大
android:toXScale="2" // 动画在水平方向X的结束缩放倍数
android:fromYScale="1" // 动画在竖直方向Y的开始缩放倍数
android:toYScale="2" // 动画在竖直方向Y的结束缩放倍数
android:pivotX="50%" // 缩放轴点的x坐标
android:pivotY="50%" // 缩放轴点的y坐标
>
</scale>
注:android:pivotX/Y 为具体值 “1” = 视图自身左上角 + 1 px;百分比 “200%” = 视图自身左上角 + 自身宽/高度*200%;parent “50p” = 视图自身左上角 + 父控件宽/高*50%
- 透明度动画(AlphaAnimation 动态创建)
<?xml version="1.0" encoding="utf-8"?>
<!--无限往返透明度动画-->
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000"
android:startOffset ="1000"
android:fillBefore = "true"
android:fillAfter = "true"
android:fillEnabled= "false"
android:repeatMode= "reverse"
android:repeatCount = "infinite"
android:interpolator = "@null"
android:fromAlpha="1.0" // 动画开始时视图的透明度(取值范围: -1 ~ 1,0 看不见,1 原状态)
android:toAlpha="0.0" // 动画结束时视图的透明度
>
</alpha>
- 组合动画(AnimationSet 动态创建)
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate
/>
<translate
/>
<alpha
/>
<scale
/>
</set>
Animation allAnimation=AnimationUtils.loadAnimation(this,R.anim.set_anim);
btn_set.startAnimation(allAnimation);
6、监听动画
anim.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// 动画开始
Log.e("tag","onAnimationStart");
}
@Override
public void onAnimationEnd(Animation animation) {
// 动画结束
Log.e("tag","onAnimationEnd");
}
@Override
public void onAnimationRepeat(Animation animation) {
// 动画重复执行的时候回调
Log.e("tag","onAnimationRepeat");
}
});
7、 Activity、Fragment 切换动画、ListView,RecycleView 出场动画。
- Activity 切换动画
startActivity(new Intent(MainActivity.this, AnimActivity.class));
// 自定义淡入淡出动画
// overridePendingTransition(R.anim.fade_in,R.anim.fade_out);
// 自定义从右向左滑动动画
overridePendingTransition(R.anim.in_from_right,R.anim.out_to_left);
@Override
public void finish() {
super.finish();
// 自定义淡入淡出动画
// overridePendingTransition(R.anim.fade_in,R.anim.fade_out);
// 自定义从左往右滑动动画
overridePendingTransition(R.anim.in_from_left,R.anim.out_to_right);
}
// fade_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
// 淡入动画
<alpha
android:duration="1500"
android:fromAlpha="0.0"
android:toAlpha="1.0"/>
</set>
// fade_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
// 淡出动画
<alpha
android:duration="1500"
android:fromAlpha="1.0"
android:toAlpha="0.0"/>
</set>
// in_from_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="1500"
android:fromXDelta="100%p"
android:toXDelta="0%p"/>
</set>
// out_to_left.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="1500"
android:fromXDelta="100%p"
android:toXDelta="0%p"/>
</set>
// in_from_left.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="1500"
android:fromXDelta="-100%p"
android:toXDelta="0%p"/>
</set>
// out_to_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="1500"
android:fromXDelta="0%p"
android:toXDelta="100%p"/>
</set>
- Fragment 切换动画
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// 设置默认动画 FragmentTransaction.TRANSIT_NONE:无动画,FragmentTransaction.TRANSIT_FRAGMENT_OPEN:标准的打开动画效果,FragmentTransaction.TRANSIT_FRAGMENT_CLOSE:标准的关闭动画效果
// fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_NONE);
// 设置自定义动画
fragmentTransaction.setCustomAnimations(R.anim.in_from_right,R.anim.out_to_left);
- ListView,RecycleView item 出场动画
// item_rv_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
>
<alpha
android:duration="1000"
android:fromAlpha="0.0"
android:toAlpha="1.0" />
<translate
android:duration="1000"
android:fromXDelta="500"
android:toXDelta="0"
/>
</set>
// layout_rv_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="0.15" // 子元素延迟时长 = 入场动画的总时长*0.15 = 150 ms
android:animationOrder="normal" // 子元素动画顺序:normal(顺序显示,排在前面的子元素先播放入场动画)、reverse(倒序显示,排在后面的子元素先播放入场动画)、random(随机播放入场动画)
android:animation="@anim/item_rv_anim" // 入场的具体动画效果
>
</layoutAnimation>
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_message"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutAnimation="@anim/layout_rv_anim">
</android.support.v7.widget.RecyclerView>