【学习笔记】Android视图动画学习

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) {}
        });



你可能感兴趣的:(【学习笔记】Android视图动画学习)