安卓中有哪些种类的动画?
一、帧动画:(逐帧动画)
这个很好理解。逐帧播放画面,利用人类视觉残留的原理,带给我们动画的感觉。它的原理和GIF图片、电影是一样的。
1.定义逐帧动画相对简单,只要使用中的子元素定义所有播放帧。
(1)Android:One Shot设定只玩一次吗?
(2) android:drawable设置每一帧图片。
(3) android:duration设置图片之间的切换间隔。
2.习惯上将AnimationDrawable设置为ImageView的背景。
Android:background = @ anim/frame _ anim
然后我们就可以用java代码得到AnimationDrawable对象了。
AnimationDrawable anim =(AnimationDrawable)imageview . get background();
(需要注意的是,默认不播放AnimationDrawable。调用它的start()方法开始播放和停止播放。)
3.以上动画文件由xml文件配置。如果愿意,也可以用java代码创建一个AnimationDrawable对象,然后通过Add Frame (Drawable Frame,Intduration)的方法给动画添加一帧,然后start()。。。
补间动画:(补间动画)
补间动画是指我们只需要指定开头和结尾的“关键帧”,其他变化帧由系统计算,而不必逐帧定义。
1.Android使用动画来表示抽象动画,包括四个子类别:AlphaAnimation(透明动画)、ScaleAnimation(缩放动画)、TranslateAnimation(位移动画)和RotateAnimation(透明动画)。Android允许用java创建动画类对象,但是一般用动画资源文件来定义动画,把界面和逻辑分开。
& ltset Android:interpolator = " @ Android:anim/linear _ interpolator " xmlns:Android = "/apk/RES/Android " & gt;
& lt!-定义透明度的转换-& gt;
& lt!-定义旋转变换-& gt;
& lt旋转Android:duration = " 3000/" Android:from degrees = " 0 " Android:pivotx = " 50% " Android:pivoty = " 50% " Android:todegrees = " 1800 " & gt;
& lt/rotate & gt;& lt/alpha & gt;& lt/set & gt;
(一个集合可以同时定义多个动画,一起执行。)
2.Android:interpolator = @ Android:anim/linear _ interpolator控制动画过程中需要添加多少帧,简单来说就是控制动画速度,有些地方翻译为“插值”。插值器有几种实现类型:线性插值器、加速插值器、加速加速插值器、循环插值器、减速插值器。具体使用请参考官方API演示。
3.定义好anim文件后,我们可以通过AnimationUtils工具类来加载,加载成功后返回一个动画。然后就可以通过视图的startAnimation(anim)开始动画了。
animation anim = animation utils . load animation(this,r . anim . anim);
//设置动画后的结束状态。
anim . setfillafter(true);
//设置插值效果
anim.setInterpolator(插值器);
//动画视图
查看。startAnimation(动漫);
三、属性动画:(属性动画)
Android 3.0引入的属性动画,可以直接改变我们物体的属性。上面提到的补间动画,只是改变了视图的绘画效果,而没有改变视图的真实属性。假设你用补间动画从左向右移动一个按钮,无论你怎么点击移动后的按钮,它都没有反应。当你在移动之前点击按钮的位置,是有反应的,因为按钮的位置属性没有改变。属性动画可以直接改变视图对象的属性值,可以让我们做更少的处理工作,提高效率和代码的可读性。
(1)ValueAnimator:包含属性动画动画的所有核心功能,如动画时间、开始和结束属性值、对应时间属性值的计算方法等。应用ValueAnimator有两个步骤。
1计算属性值。
根据属性值执行相应的操作,如更改对象的属性。
我们的主要任务是第二步。我们需要实现ValueAnimator.onUpdateListener的接口,这个接口只有一个函数,onAnimationUpdate(),会改变视图对象属性的事情都是在这个接口中完成的。
animation . addupdatelistener(new AnimatorUpdateListener(){
@覆盖
public void on animation update(value animator animation){
//做你的工作
}
});
(2)ObjectAnimator:继承自ValueAnimator,需要指定一个对象和该对象的一个属性,并在属性值计算完成时自动设置为该对象的对应属性,即完成属性动画的全部两步。在实际应用中,ObjectAnimator一般用于改变对象的一个属性,但是使用ObjectAnimator有一定的限制。如果要使用ObjectAnimator,应该满足以下条件:
1.对象应该有一个setter函数:set(驼峰命名法)。
2举下面的例子,对于像ofFloat这样的workshop方法,第一个参数是对象名,第二个参数是属性名,后一个参数是变量参数。如果只为values…参数设置了一个值,它将被假定为目标值,属性值的范围从当前值到目标值。为了获得当前值,对象应该具有相应属性的getter方法:get。
3如果有getter方法,其返回值类型应该与对应setter方法的参数类型一致。
ObjectAnimator OA = ObjectAnimator . off float(TV,alpha,0f,1f);
OA . set duration(3000);
OA . start();
如果不满足以上条件,就只能用ValueAnimator来制作动画了。
(3)动画师。AnimatorListener:可以为Animator设置动画监控,需要重写以下四个方法。
onAnimationStart()
onAnimationEnd()
onAnimationRepeat()
onAnimationCancel()
这里我们还可以实现AnimatorListenerAdapter,它的优点是我们可以只定义我们想听的事件而不用实现每个函数而只定义一个空的函数体。如下所示:
anim . add listener(new AnimatorListenerAdapter(){
AnimationEnd(Animator animation)上的公共void {
//做你的工作
}
});
(4)AnimationSet:可以组合多个动画一起工作。
animator set bouncer = new animator set();
bouncer.play(anim1)。之前(anim 2);
bouncer.play(动画2)。用(anim 3);
bouncer.play(动画2)。带有(动画4)
bouncer.play(动漫5)。(amin2)之后;
animator set . start();
上面的代码意思是:先玩动漫1;同时玩动漫2、动漫3、动漫4;最后玩动漫5。
(5)时间插值器:类似于补间中的插值器。有以下几种
加速器加速,开始时缓慢加速。
减速插补器减速,快速启动,然后减速。
加速加速器先加速,后减速,慢起慢止,中间加速。
AnticipateInterpolator则相反,先反方向换一段,再加速回放。
Anticipateovershottinterpolator反方向增加反弹,先反方向变化,然后加速播放,会超过目标值,然后慢慢向目标值移动。
BounceInterpolator跳转,到达目的值时会跳转。比如目的值是100,后面的值依次可能是85,77,70,80,90,100。
CycleIinterpolator循环,动画循环一定次数后,值变成正弦函数:Math。sin (2 * m周期*数学。Pi *输入)。
线性插值器线性,线性均匀变化
OvershottInterpolator反弹回来,最后超过目标值,然后慢慢变到目标值。
TimeInterpolator是一个允许您自定义插值器的界面。以上都实现了这个接口。
(6)关键帧:允许我们定义除开始和结束之外的关键帧。关键帧是一个抽象类。应该通过Ofint()、Offload()和OfObject()获取合适的关键帧,然后通过PropertyValueHolder获取PropertyValueHolder对象。关键帧的,如下所示:
Keyframe kf0 = Keyframe.ofInt(0,400);
key frame KF 1 = key frame . of int(0.25 f,200);
key frame kf2 = key frame . ofint(0.5f,400);
key frame kf4 = key frame . ofint(0.75 f,100);
关键帧kf3 = Keyframe.ofInt(1f,500);
PropertyValuesHolder pvhRotation = PropertyValuesHolder . of key frame(width,kf0,kf1,kf2,kf4,kf3);
ObjectAnimator rotation anim = ObjectAnimator . ofpropertyvaluesholder(BTN,pvhRotation);
上面的代码意思是:设置btn对象的width属性值为:开头Width=400,动画开头Width = 200 1/4,动画开头Width = 400 1/2,动画开头Width = 100 3/4,动画结尾Width=500。
(7)viewpropertyimator:强烈建议同时更改一个视图的多个属性。这个类优化了多属性动画,并且会合并一些无效的()来减少刷新视图。而且用起来很简单,但是要求API等级12,也就是Android 3.1以上。水平和垂直移动只需要一行代码。
myView.animate()。translationX(50f)。翻译性(100 f);
(8)一些经常需要改变的属性:
平移x,平移y:视图从原始位置的偏移。
Rotation,rotationX,rotationY: rotation,rotation用于2D旋转角度,后两个用于3D。
ScaleX,scaleY:缩放比率
x,y:视图的最终坐标是视图的左上方位置加上translationX和translation y。
阿尔法:透明度
第四,最后总结这三种动画的优缺点:
(1)帧动画主要用来播放一帧一帧的图片,类似于GIF图片。它的优点是使用简单方便,缺点是每一帧画面都需要提前准备。
(2)补间动画只需要定义开头和结尾的关键帧,改变后的中间帧由系统补充。优点是不需要准备每一帧,缺点是只改变对象绘制,不改变视图本身的属性。所以如果改变按钮的位置,还是需要点击按钮原来的位置才有效。
(3)属性动画是3.0以后推出的动画。它的优点是使用简单,降低了实现的复杂度,直接改变对象的属性,适用于几乎任何对象,而不仅仅是视图类。它的缺点是需要3.0以上的API支持,限制性相当大!但是目前国外有开源库,可以提供低版本支持!