Androids属性动画PropertyValuesHolder的使用

ValueAnimator 源码深入分析 前言 属性动画,大家应该都比较属性了,就是更改View的属性例如,宽,高,透明度等等。来实现动画效果的。那么他是如何实现的呢?又是如何保证动画从头开始执行呢? 阅读详情

属性动画是在Android3.0(API 11)后提供的,相比于补间动画功能更加强大,使用起来也更加多样灵活。平时在用属性动画时用的比较多的是这种格式:

ObjectAnimator.ofFloat(...);
ValueAnimator.ofFloat(...);
这里学习记录下PropertyValuesHolder的使用。

一般用法
使用起来和上面的格式类似:

PropertyValuesHolder xHolder = PropertyValuesHolder.ofFloat("translationX", 0, 600);
PropertyValuesHolder yHolder = PropertyValuesHolder.ofFloat("translationY", 0, 600);
ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(mIvBall, xHolder, yHolder);
animator.setDuration(1000);
animator.start();
其实就是创建两个持有对应属性在动画过程中的变量值xHolder和yHolder,在进行属性动画时可直接赋给ObjectAnimator 进行对应的动画操作。

Keyframe
Keyframe用来保存一对时间/变量的动画值,比如

Keyframe.ofFloat(float fraction, float value)
fraction:代表一个动画的时间值,范围为0-1,动画从0开始,到1结束。

value:就是在对应时间点所要设置的变量值。

Keyframe scaleFrame1 = Keyframe.ofFloat(0f, 1.0f);
Keyframe scaleFrame2 = Keyframe.ofFloat(0.5f, 2.0f);
Keyframe scaleFrame3 = Keyframe.ofFloat(1.0f, 1.0f);
PropertyValuesHolder scaleX = PropertyValuesHolder.ofKeyframe("scaleX", scaleFrame1, scaleFrame2, scaleFrame3);
PropertyValuesHolder scaleY = PropertyValuesHolder.ofKeyframe("scaleY", scaleFrame1, scaleFrame2, scaleFrame3);
ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(target, scaleX, scaleY);
animator.setDuration(2000);
animator.start();
上面的属性动画在前一秒变大两倍,在第二秒又缩小到原始大小。Keyframe并没有指定某个属性变化,它只是定义了一个时间点 fraction所对应的一个变量值value,即一个动画的关键帧,而由PropertyValuesHolder.ofKeyframe()来将这个关键帧设置到对应属性上。

Keyframe也可以设置插值器Interpolator来控制上一个关键帧到当前帧的变化,但是还是不要在这上面设置插值器,不然很经常得不到想要的效果。因为插值器的时间变化是相对于整个动画时间轴,比如:scaleFrame2.setInterpolator(new AccelerateInterpolator()); 在第二个关键帧设置加速插值器。在刚开始时动画由慢加速,在到1秒的时候,你会发现整个动画突然一闪变为第二个关键帧所设的值,比如上面直接变成2倍。因为加速变化是以整个时间轴为参考,即上面的2秒,而不是在1秒就完成整个加速,所以在快到达1秒的时候动画属性变化值肯定离关键帧指定的变化值2.0f还有一段距离,在1秒的时候就直接变成指定的2.0f了。所以插值器还是设置在ObjectAnimator上比较好。

自定义属性Property
Property可以用来定义属性,举个例子:

Property<ImageView, Float> mScaleX = new Property<ImageView, Float>(Float.class, "scaleX") {
    @Override
    public void set(ImageView object, Float value) {
        object.setScaleX(value);
    }

    @Override
    public Float get(ImageView object) {
        return object.getScaleX();
    }
};
Property<ImageView, Float> mScaleY = new Property<ImageView, Float>(Float.class, "scaleY") {
    @Override
    public void set(ImageView object, Float value) {
        object.setScaleY(value);
    }

    @Override
    public Float get(ImageView object) {
        return object.getScaleY();
    }
};

这个mScaleX定义了ImageView的"scaleX"属性,mScaleY定义了ImageView的"scaleY"属性,可以用它们来设置属性动画,比如实现上个放大缩小的效果:

Keyframe scaleFrame1 = Keyframe.ofFloat(0f, 1.0f);
Keyframe scaleFrame2 = Keyframe.ofFloat(0.5f, 2.0f);
Keyframe scaleFrame3 = Keyframe.ofFloat(1.0f, 1.0f);
PropertyValuesHolder scaleX = PropertyValuesHolder.ofKeyframe(mScaleX, scaleFrame1, scaleFrame2, scaleFrame3);
PropertyValuesHolder scaleY = PropertyValuesHolder.ofKeyframe(mScaleY, scaleFrame1, scaleFrame2, scaleFrame3);
ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(target, scaleX, scaleY);
animator.setDuration(2000);
animator.start();
看到这个你肯定想这有卵用,还不如上面的写法方便,但你想下我们属性是可以自定义,我们可以定义一些原先没有的属性操作方式,比如我们来定义一个旋转属性,正常旋转属性是0-360f表示转一圈,现在我们定义百分比旋转属性,0-1f 为一圈2f 为两圈,如下:

Property<ImageView, Float> mRotatePercentage = new Property<ImageView, Float>(Float.class, "rotatePercentage") {
    @Override
    public void set(ImageView object, Float value) {
        float rotate = value * 360f;
        object.setRotation(rotate);
    }

    @Override
    public Float get(ImageView object) {
        float rotation = object.getRotation();
        return rotation / 360f;
    }
};
下面来使用它:

Keyframe rotateFrame1 = Keyframe.ofFloat(0f, 0f);
Keyframe rotateFrame2 = Keyframe.ofFloat(0.5f, -0.5f);
Keyframe rotateFrame3 = Keyframe.ofFloat(1.0f, 1.0f);
PropertyValuesHolder rotate = PropertyValuesHolder.ofKeyframe(mRotatePercentage, rotateFrame1, rotateFrame2, rotateFrame3);
ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(mIvBall, rotate);
animator.setDuration(2000);
animator.start();
上面实现的动画为前1秒逆时针旋转180°,第二秒顺时针旋转540°,其实就是关键帧的变量值按旋转百分比来算。

如果你觉得这个没太大用处,可以看下这个开源项目:Android-SpinKit。除了能看到PropertyValuesHolder和Keyframe的一些使用方法外,还能学习自定义动画Drawable的知识,里面对画布Canvas的变化设置、图形的绘制、动画的设置进行了分层处理,很值得用来学习。

探索Android属性动画及其Demo实现 ValueAnimator是Android动画框架中非常核心的组件,它负责定义动画的执行机制,但不会直接作用于视图对象。其核心作用是随着时间的推移生成一个从起始值到结束值的数值变化,这个过程称为“动画帧”的计算。ValueAnimator不会自动更新任何对象的属性,它需要配合监听器来监听动画的进度,并在监听器中更新对象的属性值,从而实现动画效果。通过自定义估值器(Interpolator),可以实现非线性的动画效果。在自定义估值器中,开发者可以控制动画速度的变化。@Override。 阅读详情

相关推荐

Android动画介绍——属性动画(2)

2、利用AnimatorSet(组合动画):AnimatorSet 不仅可以同时执行多个动画效果,也可以让多个动画效果按照一定的顺序执行。PropertyValuesHolder这个类的意义就是,它其中保存了动画过程中所需要操作的属性和对应的值。在Android动画介绍——属性动画(1)中我们介绍了单一效果的属性动画的实现,在这里我们继续介绍多种效果叠加的属性动画实现。1、利用PropertyValuesHolder:可以将多种动画效果同时执行。多种效果叠加的属性动画实现方法有两种。

liuning1985622的博客 480

Android 动画(六)PropertyValuesHolder学习

PropertyValuesHolder ObjectAnimator只能对单个属性进行操作,如果想实现比较复杂的效果就需要用到PropertyValuesHolder了。 1.1、概述 PropertyValuesHolder这个类的意义就是,它其中保存了动画过程中所需要操作的属性和对应的值。我们通过ofFloat(Object target, String propertyName,...

Markus 3415

博客<Animation动画详解(八)——PropertyValuesHolder与Keyframe>对应源码

博客《Animation动画详解(八)——PropertyValuesHolder与Keyframe》对应源码,博客地址:http://blog.youkuaiyun.com/harvic880925/article/details/50752838

Android动画(五)PropertyValuesHolder和KeyFream使用

今天给大家介绍PropertyValuesHolder和Keyframe,在动画中也是属于比较重要的东西,请大家细品,接下来步入主题概述先看看本篇要实现的效果吧PropertyValuesHolderofInt(),ofFloat()和ofObject()KeyFreamKeyframe.ofObject(); 概述 前几篇给大家介绍了ObjectAnimator的ofInt(),ofFloat()ofObject()方法,这篇给大家带来ObjectAnimator.ofPropertyValuesHold

高级开发者进阶ing... QaQ 1097

双向晶闸管交流调压基础知识及Multisim电路仿真

本文介绍了双向晶闸管交流调压电路的工作原理及应用。该电路由双向晶闸管、RC移相电路和双向触发二极管组成,通过调节电位器改变触发角实现电压调节。当电位器阻值减小时,触发角减小,输出电压升高;阻值增大时,触发角增大,输出电压降低。Multisim仿真展示了不同电位器档位下的波形特征:0%档位时全导通,50%档位时半导通,100%档位时基本关断。该电路结构简单、调节平滑,广泛应用于调光、调速等场合,但会产生谐波干扰。

XU157303764的博客 838

Qt中多线程的使用(一)

我们要实现的是读取大文件qtgui.index的内容加入文本框中。 很容易想到的方法: QFile* file = new QFile("E:\qtgui.index"); file-&gt;open(QIODevice::ReadOnly); QTextStream *stream = new QTextStream(file); while(!st...

yao5hed的专栏 1万+

安卓 属性动画之:PropertyValuesHolder 和 AnimatorSet

这是属性动画 PropertyValues 和 AnimationSet的区别和使用

XJ200012的博客 529

UE4游戏逆向实战:从HOOK明文包到自定义发包的完整流程(附加密算法解析)

本文详细解析了UE4游戏网络通信的逆向工程完整流程。从定位线程发包点、HOOK拦截明文封包,到逆向分析加密解密算法,最终实现自定义组包与加密发送。文章结合实战案例,为游戏安全研究和技术人员提供了一套清晰、可操作的方法论。

weixin_29009081的博客 1236

自定义控件动画篇(五)——PropertyValuesHolder与Keyframe

在Android中,和Keyframe是用来创建复杂的属性动画的两个关键类。它们通常与结合使用,允许你对动画的关键帧进行精确控制,从而实现更复杂的动画效果。下面详细介绍如何使用这两个类来创建自定义控件动画。

VitorLiu的博客 697

信捷XDH PLC多轴运动控制实战:Ethercat总线下的C语言封装技巧

本文深入探讨了在信捷XDH PLC平台上,如何利用C语言对EtherCAT总线多轴运动控制进行高效封装。通过设计全局数据池、模块化状态机及用户友好接口,将底层复杂的运动控制函数库抽象为清晰、可复用的高级模块,显著提升程序稳定性与可维护性,并分享了关键的实战避坑经验。

weixin_29188043的博客 159

三菱FX5U系列PLC与汇川IT6000系列触摸屏进行MODBUS TCP通信的具体方法

三菱FX5U系列PLC与汇川IT6000系列触摸屏进行MODBUS TCP通信的具体方法

Robot_PLC_HMI_Automation 6514

Android属性动画 PropertyValuesHolder

PropertyValuesHolder PropertyValuesHolder这个类的意义就是,它其中保存了动画过程中所需要操作的属性和对应的值。我们通过ofFloat(Object target, String propertyName, float… values)构造的动画,ofFloat()的内部实现其实就是将传进来的参数封装成 PropertyValuesHolder实例来保存动画状态。在封装成 PropertyValuesHolder实例以后,后期的各种操作也是以PropertyValues

赵彦军 1144

PCL 基于视椎体裁剪点云

PCL 基于视椎体裁剪点云

dayuhaitang1的博客 4083

安卓动画学习(四) ---PropertyValuesHolder的介绍

安卓属性动画进阶PropertyValuesHolder与Keyframe可能大家都注意到了在ObjectAnimator和ValueAnimator中还有一个创建实例的方法ofPropertyValuesHolder()因为ObjectAnimator是继承自ValueAnimator的,我们就来学习一下ObjectAnimator.ofPropertyValuesHolder()吧,Value...

小黄人的博客 1232

大模型部署指南:SGLang 框架

本文介绍使用 SGLang 框架部署大模型

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 1611

【Frida Android】实战篇8:客户端证书认证绕过 Hook 教程

通过重写类的方法,自定义证书校验逻辑;利用配置文件,从系统层面管理证书信任策略;以及通过 OkHttp 框架提供的方法,实现证书的强绑定校验。这些内容主要围绕客户端如何验证服务端证书的合法性展开。客户端证书认证。当 APK 预置了客户端证书,并且服务端会对客户端证书进行校验时,传统的中间人攻击方式将面临新的挑战。我们将深入分析这种场景的工作原理,并详细介绍如何通过技术手段获取客户端证书、配置中间人工具,最终成功实现抓包分析。

水滴石穿 1426

Android自定义控件开发入门与实战(4)属性动画

以前一直是自己在网上东平西凑的找,找到的东西也是零零散散,很多时候都是看着看着就没了,时间浪费了,问题却还没得到解决,很让人抓狂。后面我就自己整理了一套资料,还别说,真香!资料有条理,有系统,还很全面,我不方便直接放出来,大家可以先看看有没有用得到的地方吧。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取![外链图片转存中…(img-kWIuAPnC-1713358266749)]

2401_84121485的博客 809

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Property Animation:PropertyValuesHolder

1)我们可以通过 PropertyValuesHolder类的工厂方法ofInt, ofFloat等方法,让它能够Hold住对应property的value。  2)在利用ObjectAnimator的ofPropertyValuesHolder方法时,再将我们上面定义的propertyValuesHolder给传进去,定义出一个objectAnimator。 3)设置objectA

wodemingzibu的专栏 548

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Android动画篇(六)—— 组合动画AnimatorSet和PropertyValuesHolder的使用

前言:把握生命里的每一分钟,全力以赴心中的梦。不经历风雨,怎么见彩虹,没有人能随随便便成功。 ----《真心英雄》 一、概述 我们在上一篇文章中已经详细讲解了ObjectAnimator的使用,但是ValueAnimator和ObjectAnimator只能简单实现一个动画,如果我要实现一个组合动画呢?比如一边缩放,一边移动那怎么办?系统也提供了一个An...

https://juejin.cn/user/1654096907477549/posts 3270

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

android evaluater_Android动画之ValueAnimator用法和自定义估值器

1 ValueAnimator和估值器简介属性动画从API11 开始提供,动画实现主要依靠ValueAnimator和ObjectAnimator两个类,类,属性动画所在包为android.animation.Animator,和补间动画有明显区别,补间动画在android.view.animation包目录下,也说明了属性动画不单单作用于view。ValueAnimator是属性动画中重要且最基...

weixin_34443842的博客 952

自定义控件三部曲之动画篇(八)——PropertyValuesHolder与Keyframe

前言:只有比牛人跑的更快,才有可能追上他的脚步。 相关文章: 《Android自定义控件三部曲文章索引》:http://blog.youkuaiyun.com/harvic880925/article/details/50995268 前几篇给大家讲了ValueAnimator、ObjectAnimator的知识,讲解了它们ofInt(),ofFloat(),ofObject()函数的用法。...

启舰 2万+

Android 属性动画(Property Animation) 完全解析 (上)

转载请标明出处:http://blog.youkuaiyun.com/lmj623565791/article/details/380674751、概述Android提供了几种动画类型:View Animation 、Drawable Animation 、Property Animation 。View Animation相当简单,不过只能支持简单的缩放、平移、旋转、透明度基本的动画,且有一定的局限性。...

weixin_30917213的博客 1127

Android属性动画(ObjectAnimator、PropertyValuesHolder、ValueAnimator、AnimatorSet)

Android属性动画  在Animator 框架中,使用最多的就是AnimatorSet和ObjectAnimator配合,使用ObjectAnimator进行更加精细的控制,只控制一个对象的一个属性值,尔斯用多个ObjectAnimator组合到AnimatorSet形成一个动画。而且ObjectAnimator能够自动驱动,可以调用setFrameDelay(longframeDelay)设置

一个写代码的胖子的博客 3779

Android 动画之属性动画ValueAnimator和ObjectAnimator

布局就是一个ImageView,看看实现代码 public void flip(View view) { ObjectAnimator visibleToInVisable = ObjectAnimator.ofFloat(mImageView, "rotationX", 0.0f, 360.0f); //设置插值器 visibleToInVi

lzy的博客 3289

Android动画了解—属性动画(Property Animation)

在Android中,动画分为两类:视图动画

Android TV 开发 1572

Android属性动画原理解析

Animator完全讲解前言概述基本用法ofFloat 前言 在前一篇Android视图动画原理解析中我提到了视图动画只能实现缩放,平移,旋转,透明度转换等一些简单的动画效果,对于复杂的动画则显得无能为力。正因为如此Google在Android 3.0之后引入了一个更强大的动画库,即属性动画(Property Animator)。今天我就来讲讲属性动画的一些知识点和它的实现原理。 概述 属性动画基...

hyhlmy的博客 1557
上一篇: Retrofit网络通信库简单封装使用
下一篇: 自定义动画效果的Drawable
Rukey7
博客等级 码龄10年 184粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值