自定义Android属性动画框架

通过本篇文章,你将会了解

  • 安卓属性动画的基本架构
  • 插值器和估值器在动画中的作用
  • 手撸属性动画

设想一下,如果你是google的工程师,让你去设计一个属性动画,你该如何设计?在设计属性动画时我们应该要考虑哪些问题?

  • 生成动画的api调用约简单越好
  • 一个View可以有多个动画,但同时只能有一个在运行
  • 动画的执行不能依赖自身的for循环
  • 如何让动画动起来

我们先来看下属性动画的种类

  • 平移动画
  • 透明度动画
  • 缩放动画
  • 旋转动画
  • 帧动画

属性动画的使用

ObjectAnimator animator = ObjectAnimator.ofFloat(view,"scale",1f,2f,3f);
animator.setInterpolator(new LinearInterpolator());
animator.setDuration(500);
animator.start() 

动画的本质

     动画实际上是改变View在某一时间点上的样式属性,比如在0.1s的时候View的x坐标为50px,在0.2s的时候View的x坐标变为150px,在0.3s的时候View的x坐标变为250px,肉眼看就会感觉View在向右移动。

    实际上是通过一个线程每隔一段时间通过调用view.setX(index++)来改变属性值产生动画效果。

    动画实际上是一个复杂的流程,需要考虑的因素比较多,在开发者层面不建议直接调用view.setX()来实现动画。

动画架构分析
在这里插入图片描述
      根据上面的架构图,我们将动画任务拆成若干个关键帧,每个关键帧在不同的时间点执行自己的动画,最终将整个动画完成,但每两个关键帧之间是有时间间隔的,我们要实现一个补帧的操作来过渡两个关键帧动画,使动画看起来衔接平滑自然。
      这里可能大家会有一个疑问:为什么要将动画分解成不同的关键帧?原因是动画完成是需要时间开销的。如果不给出关键帧动画,动画的过程将无法控制,而且在不同的时间点,控件的状态也不一样。

代码设计架构图
在这里插入图片描述

撸代码

1、首先我们来模拟VSync信号,每隔16ms发送一个信号去遍历animationFrameCallbackList执行动画Callback,定义一个VSyncManager类来模拟

public class VSyncManager {
    private List<AnimationFrameCallback> list = new ArrayList<>();

    public static VSyncManager getInstance() {
        return Holder.instance;
    }

    private VSyncManager() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(16);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android属性动画是在Android 3.0之后出现的一种强大的动画框架,它可以为几乎任何对象添加动画效果。属性动画通过在指定的时间内更改对象中的属性值来实现动画效果。与帧动画和补间动画相比,属性动画的特点是可以实现更灵活、更丰富的动画效果。属性动画可以对任意属性进行动画操作,包括Alpha(透明度)、Scale(缩放)、Rotation(旋转)和Translation(平移),甚至可以对自定义属性进行动画操作。属性动画还可以对多个属性同时进行动画操作,可以实现复杂的动画效果。总之,属性动画为开发者提供了更多自由度和创造力,使得Android应用的动画效果更加生动和丰富。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Android 属性动画原理解析](https://blog.csdn.net/mg2flyingff/article/details/112726656)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [【Android属性动画最全解析](https://blog.csdn.net/huweiliyi/article/details/105671079)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值