美文网首页
Android基础(7)动画

Android基础(7)动画

作者: perry_Fan | 来源:发表于2019-02-19 19:28 被阅读0次

    1)Android属性动画特性
    2)插值器与估值器
    3)Android动画框架实现原理。Lottie

    补间动画 属性动画
    Button mButton = (Button) findViewById(R.id.Button);
            // 创建动画作用对象:此处以Button为例
    
    // 步骤1:设置属性数值的初始值 & 结束值
            ValueAnimator valueAnimator = ValueAnimator.ofInt(mButton.getLayoutParams().width, 500);
            // 初始值 = 当前按钮的宽度,此处在xml文件中设置为150
            // 结束值 = 500
            // ValueAnimator.ofInt()内置了整型估值器,直接采用默认的.不需要设置
            // 即默认设置了如何从初始值150 过渡到 结束值500
    
    // 步骤2:设置动画的播放各种属性
            valueAnimator.setDuration(2000);
            // 设置动画运行时长:1s
    
    // 步骤3:将属性数值手动赋值给对象的属性:此处是将 值 赋给 按钮的宽度
            // 设置更新监听器:即数值每次变化更新都会调用该方法
            valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animator) {
    
                    int currentValue = (Integer) animator.getAnimatedValue();
                    // 获得每次变化后的属性值
                    System.out.println(currentValue);
                    // 输出每次变化后的属性值进行查看
    
                    mButton.getLayoutParams().width = currentValue;
                    // 每次值变化时,将值手动赋值给对象的属性
                    // 即将每次变化后的值 赋 给按钮的宽度,这样就实现了按钮宽度属性的动态变化
    
    // 步骤4:刷新视图,即重新绘制,从而实现动画效果
                    mButton.requestLayout();
    
                }
            });
    
            valueAnimator.start();
            // 启动动画
    
        }
    
      ObjectAnimator.ofInt(mButton, "width", 500).setDuration(5000).start();
    
    插值器与估值器 Interceptor
    public class PointEvaluator implements TypeEvaluator {
        // 复写evaluate()
        // 在evaluate()里写入对象动画过渡的逻辑
        @Override
        public Object evaluate(float fraction, Object startValue, Object endValue) {
    
            // 将动画初始值startValue 和 动画结束值endValue 强制类型转换成Point对象
            Point startPoint = (Point) startValue;
            Point endPoint = (Point) endValue;
    
            // 根据fraction来计算当前动画的x和y的值
            float x = startPoint.getX() + fraction * (endPoint.getX() - startPoint.getX());
            float y = startPoint.getY() + fraction * (endPoint.getY() - startPoint.getY());
    
            // 将计算后的坐标封装到一个新的Point对象中并返回
            Point point = new Point(x, y);
            return point;
        }
    
    }
    

    动画使用建议:

    Lottie原理
    1.什么是Lottie?

    1.什么是Lottie
    能够解析渲染通过 AE 上的 Bodymovin 插件将 AE 中制作好的动画导出成的 json 文件
    (1)数据源多样性—可从assets,sdcard,网络加载动画资源,动态更新
    (2)跨平台—设计稿导出一份动画描述文件,android,ios,react native通用

    2.如何制作Lottie动画
    Lottie鼓励将创作的动画开源,于是有了动画广场,并且整个流程比较简单于是乎给出个地址,就不在这里铺张开来

    制作Lottie动画教程

    Lottie动画广场

    ![动画制作流程](https://img.haomeiwen.com/i2845137/f940c7f2b9e4636a.png?imageMogr2/auto-
    orient/strip%7CimageView2/2/w/1240)

    3.Json解析流程

    Json解析流程
    • 1.结构层:可以读取到动画画布的宽高,帧数,背景色,时间,起始关键帧,结束帧等
    • 2.asset:图片资源信息集合,这里放置的是 制作动画时引用的图片资源
    • 3.layers:图层集合,这里可以获取到多少图层,每个图层的开始帧 结束帧等
    • 4.shapes:元素集合,可以获取到每个图层都包含多个动画元素
      通过这样的层级去读取文件信息 然后映射成JavaBean对象,然后通过关键类LottieDrawable将JavaBean分层渲染绘制到Canvas的画布上去

    4.分图层绘制

    5.让图形动起来

    6.运行时性能

    原生对比Lottie

    7.Lottie的API

    //从工程的Asset目录下读取动画文件
     LottieComposition.Factory.fromAssetFileName(Context context, String fileName, OnCompositionLoadedListener listener)
    
      //同步读取本地文件中的json
     LottieComposition.Factory.fromFileSync(Context context, String fileName)
    
     //从response中读取
    LottieComposition.Factory.fromJsonString(String jsonString, OnCompositionLoadedListener listener)
    

    8. 注意点
    1.如果Lottie动画包含遮罩 、 阴影 和 蒙版 ,那么性能会下降,会频 繁创建位图
    2.如果要在列表中使用动画,要使用缓存,避免内存抖动
    3.不适合播放时间较长的动画,较笨重的动画

    相关文章

      网友评论

          本文标题:Android基础(7)动画

          本文链接:https://www.haomeiwen.com/subject/igjmeqtx.html