自定义View之动画篇(十一)-PropertyValueHolder与KeyFrame

PropertyValuesHolder与KeyFrame

ValueAniamtor、ObjectAnimator除了ofInt()、ofFloat()、ofObject()构建对象外,还用一个方法也能构建对象:


		    /** 
		     * valueAnimator的 
		     */  
		    public static ValueAnimator ofPropertyValuesHolder(PropertyValuesHolder... values)   
		    /** 
		     * ObjectAnimator的 
		     */  
		    public static ObjectAnimator ofPropertyValuesHolder(Object target,PropertyValuesHolder... values)  


  1. target:表示要执行动画的控件
  2. values:可变参数,每一个value表示对控件的一个属性进行相应操作,多个values表示同时对控件的多个属性进行操作

PropertyValuesHolder从字面意思看,就是保存动画过程中要操作的属性和属性值;其实ofFloat(Object target, String propertyName, float… values)等构造的动画,ofFloat()内部
就是讲传进来的参数构建成PropertyValuesHolder对象保存

PropertyValuesHolder构建对象

作用:实现控件同时多个属性属性动画


    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(String propertyName, float… values)为例,和ObjectAniamtor.ofFloat(View target,String propertyName, float… values)一样,只是后者多了一个指定要执行动画的控件
ofObject()方法来创建动画对象时,必须显示调用setEvaluator()方法来设置Evalueator对象。

这里以PropertyValuesHolder.ofObject()为例:

这里我们实现一个TextView显示A-Z字符的动画:

我们要达到这个目的,必须实现的的几个步骤:

  1. 自定义Evaluator,动画值类型为Character类型
  2. 自定View设置set属性函数逻辑;(我们知道TextView有setText()函数啊,但是没有setText(Character character)形参的函数,所以需要我们自己实现)

PropertyValuesHolder 其他函数##


		/** 
		 * 设置动画的Evaluator 
		 */  
		public void setEvaluator(TypeEvaluator evaluator)  
		/** 
		 * 用于设置ofFloat所对应的动画值列表 
		 */  
		public void setFloatValues(float... values)  
		/** 
		 * 用于设置ofInt所对应的动画值列表 
		 */  
		public void setIntValues(int... values)  
		/** 
		 * 用于设置ofKeyframe所对应的动画值列表 
		 */  
		public void setKeyframes(Keyframe... values)  
		/** 
		 * 用于设置ofObject所对应的动画值列表 
		 */  
		public void setObjectValues(Object... values)  
		/** 
		 * 设置动画属性名 
		 */  
		public void setPropertyName(String propertyName) 
		

下面具体举一个例子更形象的了解PropertyValuseHolder使用:通对控件只想旋转、和透明度改变

KeyFrame–关键帧

构建对象:ofInt()、ofFloat()、ofObject()
作用:

  1. 解决控制动画速率(避免之前需要自己去实现插值器和Evaluator,因为需要涉及一些数学知识)

flash动画:视频中一秒钟需要播放24帧图片,是不是需要将24帧图片都画出来呢?不是,只需要将关键帧画出来(起始时间点位置,结束时间点位置),中间会自动填充,平滑的到下一个关键帧

一个关键帧必须包含两个元素:第一时间点,第二位置。即这个关键帧是表示的是某个物体在哪个时间点应该在哪个位置上。


		public static Keyframe ofFloat(float fraction, float value)

  • fraction:表示当前的显示进度,即插值器中getInterploration()函数返回值;
  • value:表示当前进度对应的位置

比如Keyframe.ofFloat(0, 0)表示动画进度为0时,动画所在的数值位置为0;Keyframe.ofFloat(0.25f, -20f)表示动画进度为25%时,动画所在的数值位置为-20;Keyframe.ofFloat(1f,0)表示动画结束时,动画所在的数值位置为0;

keyFrame常用函数


    /** 
     * 设置fraction参数,即Keyframe所对应的进度 
     */  
    public void setFraction(float fraction)   
    /** 
     * 设置当前Keyframe所对应的值 
     */  
    public void setValue(Object value)  
    /** 
     * 设置Keyframe动作期间所对应的插值器 
     */  
    public void setInterpolator(TimeInterpolator interpolator)  


关于setInterpolater()设置插值器,插值器起作用应该是上一关键帧到设置插值器这个关键帧的时间段内起作用,但有一个特殊的:第一个关键帧设置插值器,是无效的,因为第一个关键帧之前没有关键帧

如何使用Keyframe:

	public static PropertyValuesHolder ofKeyframe(String propertyName,Keyframe... values);
  1. propertyName: 动画所要的操作的属性名

  2. values:PropertyValuesHolder会根据每个Keyframe的设定,定时将制定的值输出给动画;

     Keyfrane key0=Keyframe.ofInt(0,1);
     Keyframe key1=Keyframe.ofInt(1,100);
     PropertyValuesHodler holder=PropertyValuesHolder.ofKeyframe("scaleX",key0,key1);
    
     ObjectAnimator.ofPropertyValuesHolder(iv,holder).start();
    

最后在重点讲讲比较典型的keyFrame.ofObject(…),和ofInt()等一样,也有两个构建对象的方法:


	//构建后,需要调用setValue()来设置该进度的值

    public static Keyframe ofObject(float fraction)
  
    public static Keyframe ofObject(float fraction, Object value)  

Keyframe使用注意事项:

  1. 如果没有起始帧比如:ofInt(0,1),将以定义的第一个帧为起始帧,如果没有结束帧:如ofInt(1,100),将以定义的最后一个关键帧作为结束帧;
  2. 如果整个动画只定义了一个关键帧,将报错,也就是说使用关键帧做完成动画,至少需要定义连个关键帧;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值