概述
动画的本质,其实就是把内容的两个状态平滑的过度,而不是直接切换。
示例:
/**
* 通过不断平移
* 来实现动画效果
*/
float newTranslationX = 0;
public void translationX(View view){
Runnable runnable = new Runnable() {
@Override
public void run() {
// 每次向右移动5像素,100次就是500像素。
newTranslationX += 5 ;
img.setTranslationX(newTranslationX);
}
};
for (int i =0;i<100;i++){
// 每10毫秒改变一次位置,f反复100次。
img.postDelayed(runnable,i*10);
}
}
Android 系统也提供了;
- View 动画;
只能用于 View。并且动画改变的只是 View 的显示,但没改变 View 的响应区域。
提供了四种类型的补间动画; - AlphaAnimation(透明度动画)
- RotateAnimation(旋转动画)
- ScaleAnimation(缩放动画)
- TranslateAnimation(平移动画)
- 动画集合类(AnimationSet);可将多个补间动画以组合的形式显示出来。
- 属性动画;
于 Android 3.0 (API级别11)开始添加了属性动画。可以对任意对象的属性进行动画而不仅仅是 View,动画默认时间间隔 300ms,默认帧率 10ms/帧。
提供了动画集合类(AnimatorSet),可将多个属性动画以组合的形式显示出来。
通过不断得更新 View 的属性,让它表现出动画效果,只要满足两个条件:
1、object 必须要提供 setXxx 方法,如果动画的时候没有传递初始值,那么还要提供 getXxx 方法,因为系统要去拿 xxx 属性的初始值(就是通过反射技术来获取和执行属性的 get 和 set 方法。如果这条不满足,程序直接 Crash)。
2、object的 setXxx 对属性 xxx 所做的改变必须能够通过某种方法反映出来,比如会带来ui的改变啥的(如果这条不满足,动画无效果但不会Crash)。
解决办法:
1、如有权限,给对象加上 set/get 方法。
2、用一个类来包装原始对象,间接为其提供 get/set 方法。
3、采用 ValueAnimator,监听动画过程,自己实现属性的改变。 - 逐帧动画;
可加载 Drawable 资源并逐帧的显示它们(一系列不同的图像按顺序显示)
预备知识
时间插值器(TimeInterpolator)
根据时间流逝的百分比(完成度)计算出动画进度的百分比(完成度)
<set xmlns:android="http://schemas.android.com/apk/res/android"