自定义View时,用到Paint Canvas的一些温故,PropertyAnimation中的ObjectAnimator(动画三,“大大姐”的旋转跳跃)

本文主要是介绍自定义View时,用到Paint Canvas的一些温故,PropertyAnimation中的ObjectAnimator(动画三,“大大姐”的旋转跳跃),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载请注明出处:王亟亟的大牛之路

上一篇讲了一些比较基础的view Animation 这篇会选PropertyAnimation的部分功能来讲一下,因为它的子类还是蛮多的,希望分的篇幅多点,然后可以讲细点

先上一下跑的效果(gif吃动画,见谅,大家可以自己run下)

这里写图片描述

这篇主要会讲以下几部分
- ObjectAnimator
- AnimatorSet
- PropertyValuesHolder
以及与之相关的一些知识点


Property Animation相对于我们昨天的View Animation区别在哪?

它可以改变动画的展现效果。

什么叫展现效果?
例子:我一个动画从(0,0)平移到(200,200)在使用View Animation的情况下,我只能同一时间使用一种动画效果,实现方式比较单一,难以满足我们的现实场景,但是Property Animation可以使出“组合拳”

列举一下Property Animation一些常用子类及方法

ObjectAnimator 动画的执行类(这一篇的主角)

ObjectAnimator 对象动画,当一个view同时拥有某一属性的getter、setter方法时,则可以使用该动画,来操作这一属性。

ValueAnimator 动画的执行类(ObjectAnimator的父类)

操作的范围比较广,通过Interpolator和TypeEvaluator得到某一时间内的值;再用监听器,监听值的变化,做相应的操作。

有一点很重要可以监听动画

AnimatorSet 动画集合

用于控制动画的执行先后/同时,每个动画的先后执行等。

AnimatorInflater

加载xml动画用,本文例子为java代码实现


ObjectAnimator

相比ValueAnimator类,ObjectAnimator更加实用,因为它真正可以作用在一个对象上。不过ObjectAnimator是继承自ValueAnimator的,所以主体方法还是ValueAnimator里实现的。那么我们来看看ObjectAnimator的使用吧。常用方法有这些:ofFloat(),ofInt(),ofObject(),ofArgb(),ofPropertyValuesHolder()。

绕着x/y轴旋转

LogUtils.d("--->makeAnim 4 ObjectAnimator 沿着x轴旋转");ObjectAnimator.ofFloat(imageView, "rotationX", 0.0f, 360.0f).setDuration(2000).start();LogUtils.d("--->makeAnim 5 ObjectAnimator 沿着y轴旋转");ObjectAnimator.ofFloat(imageView, "rotationY", 0.0f, 150.0f, 0.0f).setDuration(2000).start();

沿着x/y轴放大

LogUtils.d("--->makeAnim 6 ObjectAnimator 沿着x轴放大");ObjectAnimator.ofFloat(imageView, "scaleX", 1.0f, 1.5f, 1.0f).setDuration(2000).start();LogUtils.d("--->makeAnim 7 ObjectAnimator 沿着y轴放大");ObjectAnimator.ofFloat(imageView, "scaleY", 1.0f, 1.5f, 1.0f).setDuration(2000).start();

沿着x/y周平移,并且重复实施

 LogUtils.d("--->makeAnim 8 ObjectAnimator 沿着X轴平移");ObjectAnimator.ofFloat(imageView, "translationX", 0.0f, 200.0f, 0.0f).setDuration(2000).start();LogUtils.d("--->makeAnim 9 ObjectAnimator 沿着y轴平移 执行2次");ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(imageView, "translationY", 0.0f, 200.0f, 0.0f);objectAnimator.setDuration(2000);objectAnimator.setRepeatCount(2);//重复次数objectAnimator.setRepeatMode(ValueAnimator.RESTART);//重复模式objectAnimator.start();

实现复杂的效果需要以下方法的协助

setInterpolator():设置动画插值 
setDuration():设置动画执行时间 
setRepeatCount():设置动画重复次数 
setRepeatMode():设置动画重复模式 
setStartDelay():设置动画延时操作 
setTarget():设置动画的对象 
setEvaluator():设置动画过度的评估者。

那么那些组合动画怎么操作呢?

AnimatorSet

AnimationSet提供了一个把多个动画组合成一个组合的机制,并可设置组中动画的时序关系,如同时播放,顺序播放等。

这个类提供了一个play()方法,如果我们向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包括以下四个方法:

after(Animator anim) 将现有动画插入到传入的动画之后执行
after(long delay) 将现有动画延迟指定毫秒后执行
before(Animator anim) 将现有动画插入到传入的动画之前执行
with(Animator anim) 将现有动画和传入的动画同时执行

那我们来实验一下

旋转着漂移到某x,y坐标

LogUtils.d("--->makeAnim 10 ObjectAnimator 沿着y轴X轴平移 过程中旋转");ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(imageView, "translationY", 0.0f, 250.0f, 0.0f);ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(imageView, "translationX", 0.0f, 250.0f, 0.0f);ObjectAnimator objectAnimator3 = ObjectAnimator.ofFloat(imageView, "rotationY", 0.0f, 360.0f);AnimatorSet animationSet = new AnimatorSet();//组合动画animationSet.play(objectAnimator1).with(objectAnimator2).with(objectAnimator3);animationSet.setDuration(4000);animationSet.setStartDelay(1500);animationSet.start();

因为3个动画都是同时的,那么就要用with连接

那我们再试个有顺序的

LogUtils.d("--->makeAnim 11 ObjectAnimator 先放大,放大的过程中旋转,再渐消失");ObjectAnimator objectAnimator4 = ObjectAnimator.ofFloat(imageView, "scaleX", 1.0f, 2.0f, 1.0f);ObjectAnimator objectAnimator5 = ObjectAnimator.ofFloat(imageView, "scaleY", 1.0f, 2.0f, 1.0f);ObjectAnimator objectAnimator6 = ObjectAnimator.ofFloat(imageView, "alpha", 1.0f, 0.2f, 1.0f);ObjectAnimator objectAnimator7 = ObjectAnimator.ofFloat(imageView, "rotationX", 0.0f,360.0f);AnimatorSet animationSet1 = new AnimatorSet();//组合动画animationSet1.setDuration(4000);animationSet1.play(objectAnimator4).with(objectAnimator5).with(objectAnimator7).before(objectAnimator6);animationSet1.start();

先保持x,y向的放大,同时旋转,最后才消失


PropertyValuesHolder

除了AnimatorSet也可以用PropertyValuesHolder来展现“组合拳”只是PropertyValuesHolder的效果都是同时的,也就是类似于数个with一起的效果

LogUtils.d("--->makeAnim 12 ObjectAnimator 放大,旋转,渐消失");PropertyValuesHolder valuesHolder = PropertyValuesHolder.ofFloat( "scaleX", 1.0f, 2.0f, 1.0f);PropertyValuesHolder valuesHolder1 = PropertyValuesHolder.ofFloat( "scaleY", 1.0f, 2.0f, 1.0f);PropertyValuesHolder valuesHolder2 = PropertyValuesHolder.ofFloat( "alpha", 1.0f, 0.2f, 1.0f);PropertyValuesHolder valuesHolder3 = PropertyValuesHolder.ofFloat( "rotationY", 0.0f,360.0f);ObjectAnimator objectAnimator8=ObjectAnimator.ofPropertyValuesHolder(imageView,valuesHolder,valuesHolder1,valuesHolder2,valuesHolder3);objectAnimator8.setDuration(4000);objectAnimator8.start();

动画效果也就是上一个动画全部一起了上演了

未完待续

源码地址:https://github.com/ddwhan0123/BlogSample/blob/master/ViewAnimDemo.zip

相关参考可以看http://www.wfuyu.com/technology/20853.html

这篇关于自定义View时,用到Paint Canvas的一些温故,PropertyAnimation中的ObjectAnimator(动画三,“大大姐”的旋转跳跃)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/313962

相关文章

如何自定义一个log适配器starter

《如何自定义一个log适配器starter》:本文主要介绍如何自定义一个log适配器starter的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求Starter 项目目录结构pom.XML 配置LogInitializer实现MDCInterceptor

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

Kotlin Compose Button 实现长按监听并实现动画效果(完整代码)

《KotlinComposeButton实现长按监听并实现动画效果(完整代码)》想要实现长按按钮开始录音,松开发送的功能,因此为了实现这些功能就需要自己写一个Button来解决问题,下面小编给大... 目录Button 实现原理1. Surface 的作用(关键)2. InteractionSource3.

使用WPF实现窗口抖动动画效果

《使用WPF实现窗口抖动动画效果》在用户界面设计中,适当的动画反馈可以提升用户体验,尤其是在错误提示、操作失败等场景下,窗口抖动作为一种常见且直观的视觉反馈方式,常用于提醒用户注意当前状态,本文将详细... 目录前言实现思路概述核心代码实现1、 获取目标窗口2、初始化基础位置值3、创建抖动动画4、动画完成后

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现