1、Android View动画框架
Animation框架定义了透明度、旋转、缩放和位移几种常见的动画。
实现原理:每次绘制视图时, View所在的ViewGroup中的drawChild函数获取该View的Animation的Transformation值,然后调用canvas.contact(transformToApply.getMatrix()),通过矩阵运算完成动画帧。
如果动画没有完成,就继续调用invalidate()函数,启动下次绘制来驱动动画,从而完成整个动画的绘制。
对应动画:
AlphaAnimation、RotateAnimation、TranslateAnimation、ScaleAnimation四种动画。
并提供了AnimationSet动画集合,混合使用多种动画。
在Android3.0之前,视图动画一家独大,但随着Android3.0之后属性动画框架的推出,它的风光就大不如前了。
相比属性动画,视图动画的一个非常大的缺陷就是不具备交互性,当某个元素发生视图动画后,
其响应事件的位置还依然在动画前的地方,所以视图动画只能做普通的动画效果,避免交互的发生。但是它的优点也非常明显,即效率比较高且使用方便。
代码参考:
//透明动画 btn_alphatest = (Button)findViewById(R.id.btn_alphatest); btn_alphatest.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { AlphaAnimation aa = new AlphaAnimation(0, 1); aa.setDuration(1000); ll_view.startAnimation(aa); } }); //旋转动画 btn_rotatetest = (Button)findViewById(R.id.btn_rotatetest); btn_rotatetest.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //参数分别为旋转的起始角度 和 旋转中心点的坐标 // RotateAnimation ra = new RotateAnimation(0, 360, 100, 100); // ra.setDuration(1000); // btn_rotatetest.startAnimation(ra); //设置参考系为自身中心点 RotateAnimation ra = new RotateAnimation(0, 180, RotateAnimation.RELATIVE_TO_SELF, 0.5F, Animation.RELATIVE_TO_SELF, 0.5F); ra.setDuration(1000); ll_view.startAnimation(ra); } }); //位移动画 btn_translatetest = (Button)findViewById(R.id.btn_translatetest); btn_translatetest.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { TranslateAnimation ta = new TranslateAnimation(0, 200, 0, 300); ta.setDuration(1000); ll_view.startAnimation(ta); } }); //缩放动画 btn_scaletest = (Button)findViewById(R.id.btn_scaletest); btn_scaletest.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // ScaleAnimation sa = new ScaleAnimation(0, 2, 0, 2); // sa.setDuration(1000); // ll_rotate.startAnimation(sa); //设置参考系为自身中心点 ScaleAnimation sa = new ScaleAnimation(0, 1, 0, 1, Animation.RELATIVE_TO_SELF, 0.5F, Animation.RELATIVE_TO_SELF, 0.5F); sa.setDuration(1000); ll_view.startAnimation(sa); } });
2、动画集合
通过AnimationSet,可以将动画以组合的形式展示:
//组合动画 AnimationSet as = new AnimationSet(true); as.setDuration(1000); AlphaAnimation aa = new AlphaAnimation(0, 1); aa.setDuration(1000); as.addAnimation(aa); TranslateAnimation ta = new TranslateAnimation(0, 200, 0, 300); ta.setDuration(1000); as.addAnimation(ta); ll_view.startAnimation(as);
3、对动画添加相应的监听方法,经典的代码,app首页渐变,代码如下:
【摘自oschina android app 点击查看源码:http://git.oschina.net/oschina/android-app/blob/master/app/src/main/java/net/oschina/app/AppStart.java?dir=0&filepath=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Foschina%2Fapp%2FAppStart.java&oid=03161d07331d60e1a43f6584e54f655181e07aed&sha=d948fb9e0f1e01647e3168059b54293da8ade765】
final View view = View.inflate(this, R.layout.app_start, null); setContentView(view); // 渐变展示启动屏 AlphaAnimation aa = new AlphaAnimation(0.5f, 1.0f); aa.setDuration(800); view.startAnimation(aa); aa.setAnimationListener(new AnimationListener() { @Override public void onAnimationEnd(Animation arg0) { redirectTo(); } @Override public void onAnimationRepeat(Animation animation) {} @Override public void onAnimationStart(Animation animation) {} });