Android基础(7)动画

2019-02-19  本文已影响0人  perry_Fan

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解析流程

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.不适合播放时间较长的动画,较笨重的动画

上一篇下一篇

猜你喜欢

热点阅读