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可以⾃动驱动: