转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/111650621
本文出自【赵彦军的博客】

文章目录

  • ViewPropertyAnimator
  • 源码分析
    • animate()
    • withStartAction() 是如何在动画执行之前执行的
    • 取消动画
  • 实战例子

ViewPropertyAnimator

ViewPropertyAnimator是在3.1系统中加入的,ViewPropertyAnimatorObjectAnimator很像,也能改变View的实际值,但是ViewPropertyAnimator只能作用于View而不能作用于其他object。假如需要同时对多个属性执行动画时,ViewPropertyAnimator效率更高,代码更简洁、更易读。

常用方法 备注
translationX(float value) 向X轴的移动value的距离
translationY(float value) 向Y轴的移动value的距离
x(float value)、y(float value) x(valueX)、y(valueY):将目标View移动到(valueX,valueY)的坐标点上
alpha() 设置View的透明度
rotation() 旋转View
scaleX(float value)、scaleY(float value) 设置View的放缩,value是倍数,如设置scaleX(2f)是View在X轴方向放大2倍,scaleY同理
setDuration(long duration) 设置动画持续时间
setStartDelay(long startDelay) 动画开始之前的延迟时间
setListener(Animator.AnimatorListener listener) 动画监听
setInterpolator(TimeInterpolator interpolator) 时间插值器,用来修饰动画效果
setUpdateListener(ValueAnimator.AnimatorUpdateListener listener) 在API 19或以上使用 动画更新回调
withStartAction(Runnable runnable) 动画开始时设置的行为
withEndAction(Runnable runnable) 动画结束时设置的行为
xBy(float value) 在当前值的基础上,修改view 的X坐标
yBy(float value) 在当前值的基础上,修改View的Y的坐标
zBy(float value) 在当前值的基础上,修改View的Z的坐标
withLayer() 开启硬件加速,动画结束自动关闭
cancel() 取消动画

源码分析

animate()

    /*** This method returns a ViewPropertyAnimator object, which can be used to animate* specific properties on this View.** @return ViewPropertyAnimator The ViewPropertyAnimator associated with this View.*/public ViewPropertyAnimator animate() {if (mAnimator == null) {mAnimator = new ViewPropertyAnimator(this);}return mAnimator;}

withStartAction() 是如何在动画执行之前执行的

    /*** Specifies an action to take place when the next animation runs. If there is a* {@link #setStartDelay(long) startDelay} set on this ViewPropertyAnimator, then the* action will run after that startDelay expires, when the actual animation begins.* This method, along with {@link #withEndAction(Runnable)}, is intended to help facilitate* choreographing ViewPropertyAnimator animations with other animations or actions* in the application.** @param runnable The action to run when the next animation starts.* @return This object, allowing calls to methods in this class to be chained.*/public ViewPropertyAnimator withStartAction(Runnable runnable) {mPendingOnStartAction = runnable;if (runnable != null && mAnimatorOnStartMap == null) {mAnimatorOnStartMap = new HashMap<Animator, Runnable>();}return this;}

withStartAction 方法,会把 runnable实例放在 map 中,然后放在 onAnimationStart 方法中执行。

取消动画

    /*** Cancels all property animations that are currently running or pending.*/public void cancel() {if (mAnimatorMap.size() > 0) {HashMap<Animator, PropertyBundle> mAnimatorMapCopy =(HashMap<Animator, PropertyBundle>)mAnimatorMap.clone();Set<Animator> animatorSet = mAnimatorMapCopy.keySet();for (Animator runningAnim : animatorSet) {runningAnim.cancel();}}mPendingAnimations.clear();mPendingSetupAction = null;mPendingCleanupAction = null;mPendingOnStartAction = null;mPendingOnEndAction = null;mView.removeCallbacks(mAnimationStarter);}

实战例子

写一个小例子:

class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)var button: Button = findViewById(R.id.bt)button.animate().translationX(150f) //x轴向右平移.translationY(100f)  //y轴向下平移.scaleX(1.5f)  //x方向放大1.5倍.scaleY(2f)    //y方向放大2倍.setStartDelay(2000)  //延时2000秒,才开始执行动画.setInterpolator(DecelerateInterpolator())  //设置减速插值器.setDuration(800)   //动画执行时长800毫秒.setListener(object : Animator.AnimatorListener {override fun onAnimationStart(animation: Animator?) {}override fun onAnimationEnd(animation: Animator?) {}override fun onAnimationCancel(animation: Animator?) {}override fun onAnimationRepeat(animation: Animator?) {}}).start()   //开始执行}
}

效果图:

有几个细节还是值得大家注意一下:

  • 整个ViewPropertyAnimator的功能都是建立在View类新增的animate()方法之上的,这个方法会创建并返回一个ViewPropertyAnimator的实例,之后的调用的所有方法,设置的所有属性都是通过这个实例完成的。
  • 大家注意到,在使用ViewPropertyAnimator时,我们自始至终没有调用过start()方法,这是因为新的接口中使用了隐式启动动画的功能,只要我们将动画定义完成之后,动画就会自动启动。并且这个机制对于组合动画也同样有效,只要我们不断地连缀新的方法,那么动画就不会立刻执行,等到所有在ViewPropertyAnimator上设置的方法都执行完毕后,动画就会自动启动。当然如果不想使用这一默认机制的话,我们也可以显式地调用start()方法来启动动画。
  • ViewPropertyAnimator的所有接口都是使用连缀的语法来设计的,每个方法的返回值都是它自身的实例,因此调用完一个方法之后可以直接连缀调用它的另一个方法,这样把所有的功能都串接起来,我们甚至可以仅通过一行代码就完成任意复杂度的动画功能。

Android属性动画 ViewPropertyAnimator相关推荐

  1. (转)Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法

    版权声明:本文出自郭霖的博客,转载必须注明出处. 目录(?)[-] ValueAnimator的高级用法 ObjectAnimator的高级用法 转载请注明出处:http://blog.csdn.ne ...

  2. Android 系统(196)---Android 属性动画

    Android 属性动画 属性动画 总结&攻略 前言 动画的使用 是 Android 开发中常用的知识 本文将详细介绍 Android 动画中 属性动画的原理 & 使用 动画类型 关于 ...

  3. Android 属性动画 详解

    Android 属性动画 详解 Android动画类型: View Animation(即所谓的Tween Animation补间动画):View Animation相当简单,不过只能支持简单的缩放. ...

  4. android动画封装,Android属性动画封装,快速构建动画

    Android实现动画效果的方式主要有帧动画.补间动画.属性动画.关于安桌动画的基础知识可以查看这篇文章Android属性动画完全解析 这里我要讲的是如何快速构建出一个动画效果,如下图: 如果我们用属 ...

  5. Android属性动画 ObjectAnimator

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/118709616 本文出自[赵彦军的博客] 文章目录 ObjectAnimator ...

  6. android 属性动画实例,Android属性动画完全解析 中 ,ValueAnimator和ObjectAnimator的高级用法...

    大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法,当然也是最常用的一些用法,这些用法足以覆盖我们平时大多情况下的动画需求了.但是,正如上篇文章当中所说到的,属性动画对补间动画进行了 ...

  7. Android 属性动画Property Animation(中)

    Android 属性动画Property Animation(上)介绍了属性动画的概念以及相关的类和接口,本篇来看下具体肿么使用. ValueAnimator ValueAnimator指定整形.浮点 ...

  8. Android 属性动画使用(二)

    首先扯点别的:晚上稍微跑了一会步,然后逛了超市,晚饭喝的南瓜粥,吃了一碗面条,今天不是太饿,现在正一边吃着葡萄一边学习,也是没谁了. 比如说,我们想要实现从0过渡到100,使用ValueAnimato ...

  9. android+属性动画+高度,android 自定义view+属性动画实现充电进度条

    近期项目中需要使用到一种类似手机电池充电进度的动画效果,以前没学属性动画的时候,是用图片+定时器的方式来完成的,最近一直在学习动画这一块,再加上复习一下自定义view的相关知识点,所以打算用属性动画和 ...

最新文章

  1. 激光雷达与摄影测量相结合如何提高点云质量?
  2. 在Ubuntu Desktop 12.04 LTS从源代码运行ADempiere 3.6.0 LTS
  3. java 克隆的作用_关于java中克隆的学习(一)
  4. API网关正在经历身份危机
  5. 面试官问我如何做产品分析
  6. Oracle 摘去数据块的面纱
  7. Charles抓包工具安装与配置
  8. javascript 方法总结(Array篇)
  9. css3的高级而有用且很少人知道的属性和样式
  10. chrome插件开发详解
  11. 使用weblogic部署若依项目(图文教程)
  12. 如何控制局域网网速_无线路由器如何限制局域网网速 无线路由器限制局域网网速方法【介绍】...
  13. python如何求偏导_求偏导数怎样做啊
  14. 如何入门嵌入式?ARM嵌入式开发板学习方法步骤
  15. SDN开源框架:蝇量级选手Dragonflow究竟解决了什么问题
  16. 西邮Linux兴趣小组2017纳新免试题揭秘
  17. 6.xp 开机画面【欢迎使用】四个字更改方法:
  18. 开始体验WinXp + VmWare Workstation + Fedora8
  19. 数据库SQL实践25:获取员工其当前的薪水比其manager当前薪水还高的相关信息
  20. 关于println()和print()的区别

热门文章

  1. php 输出答案,php 如何只输出最后生成的那个值??
  2. linux下vim编辑器插件,linux vim编辑器插件的安装和设置方法
  3. 十三、写了两年多Python文章的我,带你走进Python数据分析
  4. Stanford NLP
  5. Transformer变体层出不穷,它们都长什么样?
  6. BERT-of-Theseus:基于模块替换的模型压缩方法
  7. 建议收藏!近期值得读的 9 篇「对抗样本」最新论文
  8. JoSE:球面上的词向量和句向量
  9. 本周Github精选 | 这12个最新AI开源项目,你一定要收下
  10. 直播预告:基于动态词表的对话生成研究 | PhD Talk #21