Android群英转读书笔记第七章(Android动画机制与使用技巧)

原创 2016年06月01日 14:36:49

动画的分类

动画分为视图动画(View)和属性动画(Property),而视图动画又分为Tween动画和Frame动画,属性动画又分为ValueAnimator和ObjectAnimator.

属性动画简介

从Android3.0开始出现,真实改变View的属性,可以响应事件

使用ObjectAnimator时,对象的属性必须有get和set方法,因为内部会通过反射来调用属性的set方法,如果一个属性没有get和set方法,可以通过下面两种方式来解决。
1.自定义一个属性类或者包装类
2.使用ValueAnimator

public class WrapperView {
    private View mTargetView;

    public WrapperView(View targetView){
        mTargetView = targetView;
    }
    public int getWidth(){
        return mTargetView.getLayoutParams().width;
    }
    public void setWidth(int width){
        mTargetView.getLayoutParams().width = width;
        mTargetView.requestLayout();
    }
}
public class MainActivity extends AppCompatActivity {

    private WrapperView wrapperView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn = (Button) findViewById(R.id.button);
        wrapperView = new WrapperView(btn);
    }
    public void click(View view){
        ObjectAnimator.ofInt(wrapperView,"width",0,500).setDuration(5000).start();
    }
}

这里写图片描述

在属性动画中,使用PropertyValueHolder可以使多个动画共同作用,用法类似于AnimationSet的使用。

ValueAnimator
本身不提供任何动画效果,更像一个数值发生器,用来产生一定规律的数字,从而让调用者控制动画的实现过程。用法如下
这里写图片描述

    //创建对象
        ValueAnimator valueAnimator = ValueAnimator.ofFloat(0,1);
        //设置要添加动画的view
        valueAnimator.setTarget(btn);
        valueAnimator.setDuration(4000);
        //启动动画
        valueAnimator.start();
        //添加监听
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                //不断获取动画过程中的值
                float animatedValue = (float) animation.getAnimatedValue();
                btn.setAlpha(animatedValue);
            }
        });

AnimatorSet也可以对一个属性进行多个动画,还能控制顺序,比前面的PropertyValueHolder更强大。

View的animate方法
在API16之后,提供了animate方法直接驱动属性动画

这里写图片描述

    btn.animate().alpha(0).y(200).setDuration(2000)
              .withStartAction(new Runnable() {
                  @Override
                  public void run() {
                      Toast.makeText(MainActivity.this, "开始", Toast.LENGTH_SHORT).show();
                  }
              }).withEndAction(new Runnable() {
          @Override
          public void run() {
              Toast.makeText(MainActivity.this, "结束", Toast.LENGTH_SHORT).show();
          }
      });
    }

布局动画
布局动画是指作用在ViewGroup上,给ViewGroup添加View时增加一个动画效果。
这里写图片描述

  protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ll = (LinearLayout) findViewById(R.id.ll);
        TranslateAnimation animation = new TranslateAnimation(720,0,0,0);
        animation.setDuration(2000);
        LayoutAnimationController controller = new LayoutAnimationController(animation,0.5f);
        controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
        ll.setLayoutAnimation(controller);
        addView();
    }
    public void addView(){
        for (int i = 0; i < 10; i++) {
            TextView textView  = new TextView(this);
            textView.setText("文字"+i);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams
                    (ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            ll.addView(textView,params);
        }
    }

自定义动画
步骤:
1.重写initialize方法做初始化动作
2.重写applyTransformation方法

这里写图片描述

public class RotateAnim extends Animation {
    private int mCenterWidth;
    private int mCenterHeight;
    private Camera camera = new Camera();
    private float mRotateY = 0.0f;
    @Override
    public void initialize(int width, int height, int parentWidth, int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
        setDuration(2000);
        setFillAfter(true);
        setInterpolator(new BounceInterpolator());
        mCenterWidth = width/2;
        mCenterHeight = height/2;
    }
    public void setRotateY(float rotateY){
        mRotateY = rotateY;
    }
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        super.applyTransformation(interpolatedTime, t);
        Matrix matrix = t.getMatrix();
        camera.save();
        camera.rotateY(mRotateY*interpolatedTime);
        camera.getMatrix(matrix);
        camera.restore();
        //设置旋转中心,
        matrix.preTranslate(mCenterWidth/2,mCenterHeight);
        matrix.postTranslate(-mCenterWidth/2,-mCenterHeight);
    }
}

Android 5.X SVG 矢量动画机制
SVG是可伸缩矢量图形,使用XML格式定义图形,图像在放大或者改变尺寸的情况下图像质量不会有损失。

Android中使用SVG需要使用下面两个API

VectorDrawable:创建基于XML的SVG图形
AnimatedVerctorDrawable:实现动画效果,比喻为一个胶水,连接静态的VectorDrawable和动态的objectAnimator

动画特效

这里写图片描述

public class MainActivity extends AppCompatActivity {

    private LinearLayout hiddenView;
    private LinearLayout ll;
    private boolean flag = false;
    private float density;
    private int hiddenViewHeight;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        density = getResources().getDisplayMetrics().density;
        hiddenViewHeight = (int) (density*40+0.5f);
        ll = (LinearLayout) findViewById(R.id.ll);
        hiddenView = (LinearLayout) findViewById(R.id.hiddenView);
        ll.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(hiddenView.getVisibility() == View.GONE){
                    hiddenView.setVisibility(View.VISIBLE);
                    ValueAnimator animator = createAnimation(hiddenView, 0, hiddenViewHeight);
                    animator.start();
                }else{
                    int oriHeight = hiddenView.getHeight();
                    ValueAnimator animator = createAnimation(hiddenView, oriHeight, 0);
                    animator.addListener(new AnimatorListenerAdapter() {
                        @Override
                        public void onAnimationEnd(Animator animation) {
                            hiddenView.setVisibility(View.GONE);
                        }
                    });
                    animator.start();
                }
            }
        });
    }

    public ValueAnimator createAnimation(final View view, int start, int end){
        ValueAnimator animator = ValueAnimator.ofInt(start,end);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams();
                params.height = (int) animation.getAnimatedValue();
                view.setLayoutParams(params);
            }
        });
        flag = true;
        return animator;
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

《Android群英传》读书笔记(8)第七章:Android动画机制与使用技巧

1.视图动画 Android视图动画的分类: 透明度动画——AlphaAnimation旋转动画——RotateAnimation位移动画——TranslateAnimation缩放动画——Sca...

Android群英传知识点回顾——第七章:Android动画机制与使用技巧

Android群英传知识点回顾——第七章:Android动画机制与使用技巧知识点目录 7.1 Android View动画框架 7.1.1 透明度动画 7.1.2 旋转动画 7...

《Android群英传》读书笔记(7)第六章:Android绘图机制与技巧之三

1.SurfaceView 一般的View通过刷新来重绘视图,Android系统通过发出VSYNC信号来进行屏幕的重绘,刷新的时间间隔是16ms。如果在16ms内View完成了所需要执行的操作,那么用...

《Android群英传》读书笔记6.Android绘图机制与处理技巧

1. 屏幕的尺寸信息1.1. 屏幕参数 屏幕大小:指屏幕对角线的长度,例如4.7寸手机、5.5寸手机 分辨率:指手机屏幕的像素点个数,例如720×1280,指宽有720个像素点,而高有1280个像素点...

《Android群英传》读书笔记(6)第六章:Android绘图机制与处理技巧之二

1.色彩特效处理1.色彩矩阵分析在色彩处理中通常从下面三个角度描述一个图像: 色调——物体传播的颜色 饱和度——颜色的纯度,从0(灰)到100%(饱和)来进行描述 亮度——颜色的相对明暗度 Andro...

android 群英传读书笔记---listview使用技巧(一)

ListView使用技巧在Android应用中,ListView作为列表展示的控件,是一个很常用的控件。在大量场合下,我们都会用到这个控件,整理一下常用的技巧。1 . ListView常用技巧 使用V...

《Android群英传》读书笔记(2)第四章:ListView常用优化技巧

1.使用ViewHolder模式提高效率ViewHolder模式充分利用了ListView的视图缓存机制,避免了每次调用getView()时都去通过findViewById()实例化控件 使用Vie...

《Android群英传》读书笔记(10)第九章:Android系统信息与安全机制

Android系统信息获取 获取系统信息的途径,有下面两种途径: android.os.BuildSystemProperty android.os.Build类里面的信息非常丰富,它包含了系统编...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android群英转读书笔记第七章(Android动画机制与使用技巧)
举报原因:
原因补充:

(最多只允许输入30个字)