PropertyValuesHolder与Keyframe 笔记

PropertyValuesHolder

ValueAnimator和ObjectAnimator都有对应的ofPorpertyValuesHolder方法

PorpertyValuesHolde创建实例的方法

java 复制代码
public static PropertyValuesHolder ofFloat(String PropertyName,float... values)
public static PropertyValuesHolder ofInt(String PropertyName,int... values)
public static PropertyValuesHolder ofObject(String PropertyName,TypeEvaluator evaluator,Object... values)
public static PropertyValuesHolder ofKeyFrame(String PropertyName,KeyFrame... values)

ofFloat,ofInt使用示例

java 复制代码
PropertyValuesHolder holder = PropertyValuesHolder.ofFLoat("alpha",0.1f,0.3f,0.7f,1f);
ObjectAnimator animator = ObjectAnimator.ofPorpertyValuesHolder(view,holder);
animator.setDuration(2000);
animator.start();

ofObject方法参数,可以实现一个自定义的插值器,使用实例:

java 复制代码
    public class CharEvaLuator implements TypeEvaluator<Character>{
        @Override
        public Character evaluate(float fraction, Character startValue, Character endValue) {
            int startInt = startValue;
            int endInt = endValue;
            int curInt = startInt + fraction * (endInt- startInt);
            char result = (Char)curInt;
            return result;
        }
    }
    
    PropertyValuesHolder holder = PropertyValuesHolder.ofObject("CharText",new CharEvaluator,
    new Character('A'),new Character('Z'));
    ObjectAnimator animator = ObjectAnimator.ofPorpertyValuesHolder(tv,holder);
    animator.setDuration(2000);
    animator.start();
    
    //注意因为TextView 中setText(CharSequence text)参数,需要内部自定义setCharText(Charactor text)结合ofObject使用

Keyframe

keyframe 我个人感觉可以理解为好比做动画时绘制的帧。

java 复制代码
public static KeyFrame ofFloat(float fraction,float duration)
//fraction 当前显示的进度,value 当前动画所在数值位置

ofFloat,ofInt使用实例:

ini 复制代码
KeyFrame frame0 = KeyFrame.ofFloat(0f,0);
KeyFrame frame1 = KeyFrame.ofFloat(0.5f,50);
KeyFrame frame2 = KeyFrame.ofFloat(1f,100);
PropertyValuesHolder holder = PropertyValuesHolder.ofKeyframe("alpha",frame0,frame1,frame2);
ObjetAnimator animator = ObjetAnimator.ofPropertyValuesHolder(view,holder);
animator.setDuration(2000);
animator.start();

//也可以给除第一帧以外的设置插值器
frame1.setInterpolator(new BounceInterpolator());

ofObject()同样也可以实现一些自定义的属性参数,例如

ini 复制代码
KeyFrame frame0 = KeyFrame.ofObject(0,new Character('A'));
KeyFrame frame1 = KeyFrame.ofObject(0,new Character('B'));
KeyFrame frame2 = KeyFrame.ofObject(0,new Character('C'));

//结合上面的CharEvaLuator自定义插值器使用
PropertyValuesHolder holder = PropertyValuesHolder.ofKeyframe("CharText",frame0,frame1,frame2);
holder.setEvalutar(new CharEvaLuator());
ObjetAnimator animator = ObjetAnimator.ofPropertyValuesHolder(view,holder);
animator.setDuration(2000);
animator.start();
注意
  1. 多个KeyFrame,都会默认把第一个frame设为首帧,最后一个设为尾帧,不管是不是你期望的效果

  2. 必须存在2个或2个以上的frame,不然会报数组越界

相关推荐
dalancon16 小时前
InputDispatcher派发事件,查找目标窗口
android
我命由我1234516 小时前
Android Framework P3 - MediaServer 进程、认识 ServiceManager 进程
android·c语言·开发语言·c++·visualstudio·visual studio·android runtime
天才少年曾牛17 小时前
Android14 新增系统服务后,应用调用出现 “hidden api” 警告的原因与解决方案
android·frameworks
赏金术士17 小时前
Jetpack Compose 底部导航实战教程(完整版)
android·kotlin·compose
随遇丿而安17 小时前
第5周:XML 资源、样式和主题,真正解决的是“页面以后还改不改得动”
android
zh_xuan18 小时前
Android 获取系统内存页大小:sysconf(_SC_PAGESIZE) 与 JNI 实现
android·jni·ndk·内存页大小
fundroid19 小时前
Google I/O 2026 | Android 全面进化:从操作系统到“智能中枢”
android·jetpack compose·google i/o 2026
zh_xuan20 小时前
Android 复用 .so 库:通过 jniLibs 集成预编译二进制库(获取 Page Size )
android·jni·ndk·内存页大小
匆忙拥挤repeat21 小时前
Android Compose 约束布局
android
好安静21 小时前
Android ShellTransitions 机制完整分析(by DeepSeekV4Pro)
android