zoukankan      html  css  js  c++  java
  • 动画之属性动画内容

    当然,我也想补充一点,关于组合动画这部分,应该把PropertyValuesHolder这个加上。单纯的使用AnimatorSet,仅仅只是将各种不同的动画组合,效果看起来还是动画各自执行。而使用PropertyValuesHolder,可以将各种效果实现复合,各种动画一起执行,效果看起来更像一个整体。

    ObjectAnimator.ofPropertyValuesHolder这个应该加上去

    @作者 ValueAnimation 中好像有问题

    anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {

    int currentValue = (Integer) animation.getAnimatedValue();
    // 获得改变后的值

    System.out.println(currentValue);
    // 输出改变后的值

    // 步骤4:将改变后的值赋给对象的属性值,下面会详细说明
    View.setproperty(currentValue);

    // 步骤5:刷新视图,即重新绘制,从而实现动画效果
    View.requestLayout();


    }
    });
    这个代码中的第4,5步中的View 有问题,你没有体现View在哪里定义且 View大写开头是类型。所以我觉得这里是错误。


    @作者 是的 // 步骤4:将改变后的值赋给对象的属性值,下面会详细说明
    View.setproperty(currentValue);

    // 步骤5:刷新视图,即重新绘制,从而实现动画效果
    View.requestLayout();
    中的View到底是什么不明确啊 我代码里用View或者具体的TextView实例 都不行


    @情深难忘 作者这里是伪代码,setproperty 就是设置属性的意思,比如下文的setWidth ,也可以是setHeight,甚至是一个Person(自定义对象)对象的setName,所以这是泛指,下边那个调用requestLayout也是一样的道理,调用它的是个View,可以是Button,也可以是TextView


    @情深难忘 伪代码而已,替换成你想要设置动画的任何一个View实例即可。

    我用ObjectAnimator.ofInt(button, "width", button.getWidth()+200).setDuration(1000).start();这个是有动画效果的。
    因为你的button 是设置的wrap_content, 如果设置成绝对值或是match_parent就没有效果了, wrap_content用的是控件最小宽度所以会有效果呀


    关于ObjectAnimator修改View的Alpha,TranslationX的属性时,是不会不断调用invalidate,继而调用onDraw进行不断绘制。而是直接调用RenderNode的native方法,来形成动画效果的。
    有个地方说错了吧,with/after/before都不是AnimatorSet的方法,而是AnimatorSet.Builder 的方法~

    现在在我的版本(26)中,是看不见ObjectAnimator或者ValueAnimator有调用invalidate的,它采用的是将当前动画加入到动画list中等待执行。可能跟invalidate有点类似,但是确实没调用,博主第一张图一开始有点把我误导了。

     

    前言

    • 属性动画的使用 是 Android 开发中常用的知识
    • 本文将献上一份全面 & 详细的属性动画学习指南,将详细介绍属性动画的所有内容,包括:意义、作用、应用场景、功原理 & 具体使用等,希望你们会喜欢。

    目录

     

    1. 意义

    • 属性动画(Property Animation)是在 Android 3.0API 11)后才提供的一种全新动画模式
    • 那么为什么要提供属性动画(Property Animation)?

    1.1 背景

    实现动画效果在Android开发中非常常见,因此Android系统一开始就提供了两种实现动画的方式:

    • 逐帧动画(Frame Animation
    • 补间动画( Tweened animation

    1.2 问题

    逐帧动画 & 补间动画存在一定的缺点:

    a. 作用对象局限:View

    即补间动画 只能够作用在视图View上,即只可以对一个ButtonTextView、甚至是LinearLayout、或者其它继承自View的组件进行动画操作,但无法对非View的对象进行动画操作

    1. 有些情况下的动画效果只是视图的某个属性 & 对象而不是整个视图;
    2. 如,现需要实现视图的颜色动态变化,那么就需要操作视图的颜色属性从而实现动画效果,而不是针对整个视图进行动画操作
    b. 没有改变View的属性,只是改变视觉效果
    • 补间动画只是改变了View的视觉效果,而不会真正去改变View的属性。
    • 如,将屏幕左上角的按钮 通过补间动画 移动到屏幕的右下角
    • 点击当前按钮位置(屏幕右下角)是没有效果的,因为实际上按钮还是停留在屏幕左上角,补间动画只是将这个按钮绘制到屏幕右下角,改变了视觉效果而已。
    c. 动画效果单一
    • 补间动画只能实现平移、旋转、缩放 & 透明度这些简单的动画需求
    • 一旦遇到相对复杂的动画效果,即超出了上述4种动画效果,那么补间动画则无法实现。

    即在功能 & 可扩展性有较大局限性

    1.3 解决方案

    • 为了解决补间动画的缺陷,在 Android 3.0(API 11)开始,系统提供了一种全新的动画模式:属性动画(Property Animation
    • 下面,我将全面介绍属性动画(Property Animation

    2. 简介

    • 作用对象:任意 Java 对象

    不再局限于 视图View对象

    • 实现的动画效果:可自定义各种动画效果

    不再局限于4种基本变换:平移、旋转、缩放 & 透明度


    3. 特点

    • 作用对象进行了扩展:不只是View对象,甚至没对象也可以
    • 动画效果:不只是4种基本变换,还有其他动画效果
    • 作用领域:API11后引入的

    4. 工作原理

    • 在一定时间间隔内,通过不断对值进行改变,并不断将该值赋给对象的属性,从而实现该对象在该属性上的动画效果

    可以是任意对象的任意属性

    • 具体的工作原理逻辑如下:
     
    工作原理
    • 从上述工作原理可以看出属性动画有两个非常重要的类:ValueAnimator 类 & ObjectAnimator
    • 其实属性动画的使用基本都是依靠这两个类
    • 所以,在下面介绍属性动画的具体使用时,我会着重介绍这两个类。

    5. 具体使用

    对于属性动画的使用,主要是:

    1. 两个使用方法类:ValueAnimator 类 & ObjectAnimator
    2. 两个辅助使用类:插值器 & 估值器

    下面将详细介绍

    5.1 ValueAnimator类

    • 定义:属性动画机制中 最核心的一个类
    • 实现动画的原理:通过不断控制 值 的变化,再不断 手动 赋给对象的属性,从而实现动画效果。如图下:
     
    工作原理

    从上面原理可以看出:ValueAnimator类中有3个重要方法:

    1. ValueAnimator.ofInt(int values)
    2. ValueAnimator.ofFloat(float values)
    3. ValueAnimator.ofObject(int values)
    • 下面我将继续讲解另外一个重要的类:ObjectAnimator

    5.2 ObjectAnimator类

    5.2.1 实现动画的原理

    直接对对象的属性值进行改变操作,从而实现动画效果

    1. 如直接改变 Viewalpha 属性 从而实现透明度的动画效果
    2. 继承自ValueAnimator类,即底层的动画实现机制是基于ValueAnimator
    • 本质原理: 通过不断控制 值 的变化,再不断 自动 赋给对象的属性,从而实现动画效果。如下图:
     
    工作原理

    从上面的工作原理可以看出:ObjectAnimatorValueAnimator类的区别:

    • ValueAnimator 类是先改变值,然后 手动赋值 给对象的属性从而实现动画;是 间接 对对象属性进行操作;
    • ObjectAnimator 类是先改变值,然后 自动赋值 给对象的属性从而实现动画;是 直接 对对象属性进行操作;

    至于是如何自动赋值给对象的属性,下面会详细说明


    5.3 ValueAnimator类 & ObjectAnimator 类的区别

    • 对比ValueAnimator类 & ObjectAnimator 类,其实二者都属于属性动画,本质上都是一致的:先改变值,然后 赋值 给对象的属性从而实现动画效果。
    • 但二者的区别在于:
      ValueAnimator 类是先改变值,然后 手动赋值 给对象的属性从而实现动画;是 间接 对对象属性进行操作;

    ValueAnimator 类本质上是一种 改变 值 的操作机制

    ObjectAnimator类是先改变值,然后 自动赋值 给对象的属性从而实现动画;是 直接 对对象属性进行操作;

    可以理解为:ObjectAnimator更加智能、自动化程度更高


    5.4 插值器

     
    示意图

    更加具体介绍请看文章:Android:手把手带你深入了解神秘的估值器(TypeEvaluator)


    5.5 估值器

     
    示意图

    更加具体介绍请看文章:Android 动画:手把手带你深入了解神秘的插值器(Interpolator)


    5.6 插值器与估值器的区别

    估值器和插值器很多人容易混淆,具体区别如下:

     
    示意图

    6. 使用小技巧

    对于属性动画的使用小技巧包括:

    • 组合动画
    • 快捷使用动画
    • 监听动画
    • 动画适配器

    具体请看文章:Android 动画:这些属性动画的使用小技巧你了解吗

    至此,Android 动画中的属性动画的所有知识点都讲解完毕。


    7. 总结

    • 属性动画的本质原理:通过不断对值进行改变,并不断将该值赋给对象的属性,从而实现该对象在该属性上的动画效果;具体工作原理逻辑如下:


       
      工作原理
    • 属性动画的使用主要有以下类,具体如下:
     
    主要使用类

    请点赞!因为你们的赞同/鼓励是我写作的最大动力!


    欢迎关注Carson_Ho的简书!

    不定期分享关于安卓开发的干货,追求短、平、快,但却不缺深度


    作者:Carson_Ho
    链接:https://www.jianshu.com/p/2412d00a0ce4
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    设计模式学习总结系列应用实例
    【研究课题】高校特殊学生的发现及培养机制研究
    Linux下Oracle11G RAC报错:在安装oracle软件时报file not found一例
    python pro practice
    openstack python sdk list tenants get token get servers
    openstack api
    python
    git for windows
    openstack api users list get token get servers
    linux 流量监控
  • 原文地址:https://www.cnblogs.com/awkflf11/p/12860195.html
Copyright © 2011-2022 走看看