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解析流程
- 1.结构层:可以读取到动画画布的宽高,帧数,背景色,时间,起始关键帧,结束帧等
- 2.asset:图片资源信息集合,这里放置的是 制作动画时引用的图片资源
- 3.layers:图层集合,这里可以获取到多少图层,每个图层的开始帧 结束帧等
- 4.shapes:元素集合,可以获取到每个图层都包含多个动画元素
通过这样的层级去读取文件信息 然后映射成JavaBean对象,然后通过关键类LottieDrawable将JavaBean分层渲染绘制到Canvas的画布上去
4.分图层绘制
5.让图形动起来
6.运行时性能
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.不适合播放时间较长的动画,较笨重的动画