Android动画机制与使用技巧

  • 格式:pdf
  • 大小:184.14 KB
  • 文档页数:8

Android动画机制与使⽤技巧

动画效果⼀直是⼈机交互中⾮常重要的部分,与死板、突兀的显⽰效果不同,动画效果的加⼊,让交互变得更加友好,

特别是在提⽰、引导类的场景中,合理地使⽤动画能让⽤户获得更加愉悦的使⽤体验

⼀、Android View动画框架

Animation框架定义了透明度、旋转、缩放、位移等⼏种常见的动画实现原理:

每次绘制View时,ViewGroup中的drawChild函数获取该view的Animation的Transformation值,然后调⽤canvas.concat(transformToApply.getMatrix())

通过矩阵运算完成帧动画,如果动画没有完成,就继续调⽤invalidate() 函数,启动下次绘制来驱动动画,从⽽完成整个动画的绘

制。⼆、帧动画帧动画就是⼀张张图⽚不同的切换,形成的动画效果。

⼀般⼿机的开机动画,应⽤的等待动画等都是帧动画,因为只需要⼏张图⽚轮播,极其节省资源,如果真的设计成动画,那么是很耗费资源的事。

在res⽬录下新建⼀个drawable⽂件夹并定义xml⽂件,⼦节点为 animation-list,在这⾥定义要显⽰的图⽚和每张图⽚的显⽰时长。

android:oneshot="false">

在屏幕上播放帧动画,需要布局⽂件有⼀个ImageView来显⽰动画图⽚

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

ImageView iv = (ImageView) findViewById(R.id.iv);

//把动画⽂件设置为imageView的背景

iv.setBackgroundResource(R.drawable.frameanimation);

AnimationDrawable ad = (AnimationDrawable) iv.getBackground();

//播放动画

ad.start();

}

}三、补间动画(视图动画)组件由原始状态向终极状态转变时,为了让过渡更⾃然,⽽⾃动⽣成的动画叫做补间动画。

主要是在Android 3.0之前最⼤的缺陷就是不具备交互性

位移、旋转、缩放、透明

public class MainActivity extends Activity {

private ImageView iv;

private TranslateAnimation ta;

private RotateAnimation ra;

private ScaleAnimation sa;

private AlphaAnimation aa;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

iv = (ImageView) findViewById(R.id.iv);

}

//位移动画

public void translate(View v){

//创建位移动画的对象,设置动画的初始位置和结束位置

//10,100表⽰,从imageview的真实坐标的左上⾓ x+10,移动到 x+100的位置

//20,200表⽰,从imageview的真实坐标的左上⾓ y+20,移动到 y+200的位置

//ta = new TranslateAnimation(10, 100, 20, 200);

//Animation.RELATIVE_TO_SELF相对于⾃⼰

//对于x,表⽰,相对于⾃⼰,起点是 imageview的真是坐标的左上⾓ x+ 0.5*iv的宽度 到 x+ 2*iv的宽度

//y 就是乘以 iv 的⾼度,也可以相对于⽗控件,但是⽤的⽐较少

ta = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 2,

Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 2);

//设置播放时间

ta.setDuration(2000);

//设置重复次数,播放⼀次,重复⼀次

ta.setRepeatCount(1);

//设置重复放的模式

ta.setRepeatMode(Animation.REVERSE);

//动画播放完毕后,组件停留在动画结束的位置上

ta.setFillAfter(true);

//播放动画

iv.startAnimation(ta);

}

//旋转动画

public void rotate(View v){

//20表⽰开始的⾓度,180表⽰结束的⾓度,默认的旋转圆⼼在iv左上⾓

//ra = new RotateAnimation(20, 180);

//指定圆⼼坐标,相对于⾃⼰, iv真实的坐标左上⾓ x+ 0.5*iv宽度, y+0.5*iv⾼度

ra = new RotateAnimation(20, 360,

Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);

ra.setDuration(2000);

ra.setRepeatCount(1);

ra.setRepeatMode(Animation.REVERSE);

iv.startAnimation(ra);

}

//缩放动画

public void scale(View v){

//sa = new ScaleAnimation(fromX, toX, fromY, toY);

//改变缩放的中⼼点,相对于⾃⼰的中⼼坐标,iv的真是坐标左上⾓ x+0.5*iv宽度, y+0.5*iv⾼度

sa = new ScaleAnimation(0.5f, 2, 0.1f, 3,

Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);

sa.setDuration(2000);

sa.setRepeatCount(1);

sa.setRepeatMode(Animation.REVERSE);

iv.startAnimation(sa);

}

//透明动画

public void alpha(View v){

//0为完全透明,1为完全透明

aa = new AlphaAnimation(0, 1);

aa.setDuration(2000);

aa.setRepeatCount(1);

aa.setRepeatMode(Animation.REVERSE);

iv.startAnimation(aa);

}

//所有动画⼀起飞

public void fly(View v){

//创建动画集合 false表⽰每个动画的时间校准有动画⾃⼰决定, true表⽰有动画集合决定

AnimationSet set = new AnimationSet(false);

set.addAnimation(aa);

set.addAnimation(ra);

set.addAnimation(sa);

set.addAnimation(ta);

iv.startAnimation(set);

}

}四、属性动画

补间动画,只是⼀个动画效果,组件其实还在原来的位置上,xy没有改变。属性动画是组件的位置发⽣了真实的改变,⽽且在动画的过程中组件的位置是实时改变的,可以相应组件事件。

使⽤最多的就是 AnimatorSet和ObjectAnimator配合:

使⽤ObjectAnimator进⾏更精细化控制,只控制⼀个对象的⼀个属性值

使多个ObjectAnimator组合到AnimatorSet形成⼀个动画

ObjectAnimator可以⾃动驱动: