前言
- 动画绘制与 View 绘制有哪些区别?
- Android 动画框架是什么?适应场景有哪些?
动画机制
Android 内部有一套动画框架,开发者通过调用 Api 能够快速实现华丽丽的动画效果。
动画和 View 有着密切联系,其中动画的重绘在 ViewGroup.drawChild 中实现,听说刷新间隔10ms。
视图动画
View(视图)动画的作用对象是 View,有四种效果:平移动画,缩放动画,透明度动画,旋转动画。
名称 | 标签 | 子类 | 效果 |
---|---|---|---|
平移动画 | TranslateAnimation | 移动 View | |
缩放动画 | ScaleAnimation | 放大或缩小 View | |
透明度动画 | AlphaAnimation | 改变 View 的透明度 | |
旋转动画 | RotateAnimation | 旋转 View |
Interpolater
插值器:影响动画的播放速度,比如非匀速动画需要插值器来控制播放流程。
属性动画
API 11 以后新加入了属性动画,使用属性动画移动的 View 是真正移动到了相应的位置,也就是说具有可交互性。
属性动画从 API 11 才有,但是 J神推出了兼容版本 Nineoldandroids 对Android3.0 以前的版本进行兼容,目前这些版本早已经退出市场,所以兼容性已经不是问题。
流程图
图片来自 https://blog.youkuaiyun.com/carson_ho/article/details/72909894
ValueAnimator 的示例代码,将宽度为 100dp 的 button,改为 500dp,设置动画时间 3s。
// 步骤1:设置动画的初始值和结束值
ValueAnimator valueAnimator = ValueAnimator.ofInt(button.getLayoutParams().width,500);
// 步骤2:设置播放时间
valueAnimator.setDuration(3000);
// 步骤3:绑定监听器
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animator) {
int currentValue = (Integer) animator.getAnimatedValue();
// 获得每次变化后的属性值
System.out.println(currentValue);
// 输出每次变化后的属性值进行查看
button.getLayoutParams().width = currentValue;
// 每次值变化时,将值手动赋值给对象的属性
// 即将每次变化后的值 赋 给按钮的宽度,这样就实现了按钮宽度属性的动态变化
// 步骤4:刷新视图,即重新绘制,从而实现动画效果
button.requestLayout();
}
});
// 启动动画
valueAnimator.start();
插值器和估值器
之前的 Button 的变化动画中,并未使用插值器和估值算法,因为它是匀速动画,这两个工具是实现非匀速动画的重要手段。
插值器 | 作用 | 估值算法 | 作用 |
---|---|---|---|
线性插值器 | 匀速动画 | IntEvaluator | 针对整型属性 |
加速减速插值器 | 两头慢中间快 | FloatEvaluator | 针对浮点型 |
减速插值器 | 动画越来越慢 | ArgbEvaluator | 针对 Color 属性 |