序:补间动画和帧动画的区别
帧动画是通过连续播放图片来模拟动画的效果。
补间动画是通过在两个关键帧之间补充渐变的动画效果来实现。
1.补间动画简介
补间动画的实现类主要是在android.view.animation包下。在这个包下主要包含AlphaAnimation,RotateAnimation,TranslateAnimtion,ScaleAnimation四种补间动画,他们的集合类AnimationSet,他们的工具类AnimationUtils。以及十种动画差值器等。接下来主要整理下四种补间动画在XML和JavaCode中的使用方式以及部分API的说明。
2.TranslateAnimtion
平移动画:给View添加移动的动画效果。比如“抖动效果”。
在JavaCode中的写法:
// fromXDelta动画开始前X轴位置,toXDelta动画结束后的X轴位置,fromYDelta动画开始前Y轴的位置,toYDelta动画结束后的Y轴的位置
TranslateAnimation ta = new TranslateAnimation(-100, 100, 0, 0);
// 动画执行的时间
ta.setDuration(2000);
// 动画和View绑定,开始动画
ivTranslateAnim.startAnimation(ta);
在XML中的写法:
首先在res下新建一个anim文件夹,然后创建一个关于动画的XML文件。
android:duration="2000"
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="100"
android:toYDelta="0">
然后在javaCode中利用AnimationUtils来获得该动画对象
Animation ta = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.translate);
ivTranslateAnim2.startAnimation(ta);
3.AlphaAnimation
透明度动画:给View添加透明度的动画效果,比如闪烁。
在JavaCode中的写法:
// fromAlpha,toAlpha 这2个参数分别表示开始和结束该控件的透明度,0是完全透明,1是不透明
AlphaAnimation aa = new AlphaAnimation(0, 1);
其他的和TranslateAnimtion类似
4.RotaeAnimation
旋转动画,既然是旋转动画就需要知道一个旋转的点和旋转多少
// fromDegrees起始角度,toDegrees结束角度,pivotX旋转点X轴坐标,pivotY旋转点Y轴坐标
RotateAnimation ra = new RotateAnimation(0, 360, 100, 100);
5.ScaleAnimation
缩放动画,也需要知道缩放的比例和缩放的点
// fromX起始值的X轴倍数, toX缩放后的X轴倍数, fromY起始值的Y轴倍数, toY缩放后的Y轴倍数
// pivotXTypeX轴点类型, pivotXValueX轴点的值比例, pivotYTypeY轴点类型
// pivotYValueY轴点的值比例
ScaleAnimation sa = new ScaleAnimation(0, 1, 0, 1, Animation.RELATIVE_TO_SELF, 0.5F,
Animation.RELATIVE_TO_SELF, 0.5F);
6.AnimationSet
前面结束了四种动画,难度都只能单独使用?显然不是,我们可以使用组合动画将多种动画组合到一个View上使用:
通过setStartOffset来控制多个动画直接的时间间隔。
// 是否共享差值器
AnimationSet as = new AnimationSet(true);
TranslateAnimation ta = new TranslateAnimation(0, 100, 0, 0);
ta.setDuration(1000);
// 添加动画
as.addAnimation(ta);
RotateAnimation ra = new RotateAnimation(0, 360, RotateAnimation.RELATIVE_TO_SELF, 0.5f,
RotateAnimation.RELATIVE_TO_SELF, 0.5f);
ra.setDuration(1000);
ra.setStartOffset(1000);
as.addAnimation(ra);
ivSetAnim.startAnimation(as);
7.部分API的说明
setDuration(durationMillis);//设置动画的时间,单位是毫秒
setInterpolator(i);//设置动画的差值器,有10种,默认的是LinearInterpolator线性差值器
setFillAfter(fillAfter);//设置动画结束后,是否保持状态,默认是false
setFillBefore(fillBefore);//动画结束时是否还原到初始状态
setFillEnabled(boolean);//动画结束时是否还原到初始状态,同上
setRepeatCount(repeatCount);//设置动画执行的次数,Animation.INFINITE表示无限
setRepeatMode(repeatMode);//设置动画执行的方式,有正序Animation.RESTART,和倒序Animation.REVERSE
setStartOffset(durationMillis)//设置动画之间的时间间隔,用于组合动画
setZAdjustment(Animation.ZORDER_TOP);//动画在Z轴的位置top,bottom,normal ,没用过
anim.cancel();//取消动画的方法
8.补间动画的"假"(不足之处)
为什么说这个动画有点假?因为它只是视图上的变化,实际上的位置并没有改变,即它的属性没有改变。改变的只是他的绘制位置。
在《Android群英传》一书中,这样说到:
视图动画有个非常大的缺陷就是不具备交互性,当某个元素发生视图动画后,其响应事件的位置还依然在动画前的位置,所以视图动画只能做普通的动画效果,避免发生交互。
《Android群英传》这本是去年买的,现在看了大部分的内容,感觉通俗易懂,很实用,强力推荐~
下面做一个实验:
利用平移动画来移动一个控件,并且给这个控件设置点击事件,结果发现控件移动了,可是点击事件还在原地。
findViewById(R.id.btnTweenDefect).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
TranslateAnimation ta = new TranslateAnimation(0, 200, 0, 200);
ta.setDuration(2000);
ta.setFillAfter(true);
ivTweenDefect.startAnimation(ta);
}
});
ivTweenDefect.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "别点我", Toast.LENGTH_SHORT).show();
}
});
9.源码地址:
csdn下载地址