零零碎碎的东西总是记不长久,仅仅学习别人的文章也只是他人咀嚼后留下的残渣。无意中发现了这个每日一道面试题,想了想如果只是简单地去思考,那么不仅会收效甚微,甚至难一点的题目自己可能都懒得去想,坚持不下来。所以不如把每一次的思考、理解以及别人的见解记录下来。不仅加深自己的理解,更要激励自己坚持下去。

补间动画

补间动画是根据我们设置好的view起始形态与终止形态,通过插值器与duration(时长)自动计算出中间view的平滑变化而实现动画效果。

补间动画有TranslateAnimation(平移)、ScaleAnimation(缩放)、RotateAnimation(旋转)、AlphaAnimatio(渐变)四个类,这些只是很基本的四种动画效果,如果我们需要在此基础上更为复杂的动画效果,可以继承这四个类进行装饰。

一般情况下我们都是在xml文件中定义补间动画,属性设置大致有起始值、终止值、时长(duration)、插值(interpolator,即动画的变化速度,加速、减速、匀速、抛物线速度)四个属性,四种动画效果的标签---translate、scale、rotate、alpha。具体属性设置及意义如下:

android:fromXDelta="0%"

android:fromYDelta="0%"

android:toXDelta="100%"

android:toYDelta="100%"

android:duration="@integer/animation_duration"/>

android:fromXScale="0.5"

android:fromYScale="0.5"

android:toXScale="1.0"

android:toYScale="1.0"

android:pivotX="50%"

android:pivotY="50%"

android:duration="@integer/animation_duration"/>

android:fromDegrees="0"

android:toDegrees="1800"

android:pivotY="50%"

android:pivotX="50%"

android:duration="@integer/animation_duration"/>

android:fromAlpha="1"

android:toAlpha="0.5"

android:duration="@integer/animation_duration"/>

复制代码

java代码设置

Animation animation = AnimationUtils.loadAnimation(this, R.anim.activity_open_enter);

animation.start();

imageView.setAnimation(animation);

复制代码

属性动画

属性动画更为强大。补间动画只能自定义两个关键帧在旋转、位移、缩放、透明度四个方面的变化,而属性动画可以定义任何属性的变化。另外,补间动画只能对UI组件执行动画,但属性动画几乎可以对任何对象执行动画(不管它是否在屏幕上显示)。

属性动画有三个关键的类---ValueAnimation、ObjectAnimation、AnimationSet

ValueAnimation

属性动画主要的时间引擎,负责计算各个帧的属性值。它定义了属性动画绝大部分核心功能,包括计算各帧的属性值,负责处理更新事件、按属性类型值控制计算规则等。

ValueAnimation创建动画步骤:

使用ValueAnimation的静态方法ofInt()、ofFloat、ofObject()创建ValueAnim实例。

通过setXxx()设置动画持续时间、插值方式、重复次数等

调用start方法启动动画

上面三个步骤仅仅是计算出了各个帧的属性值,我们需要注册AnimationUpdateListener监听器,在监听器中监听ValueAnimation计算出来的值的改变,应用到指定对象上

ValueAnimator valueAnimator = ValueAnimator.ofInt(0,100);

valueAnimator.setDuration(1000 * 3);

valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator animation){

//获得变化的属性值

int time = (int) animation.getAnimatedValue();

...//对指定对象进行属性值更新操作

}

});

复制代码

一般来说,ValueAnimation、本身并不显示任何动画,它更像是一个数值计算器。通过ofXxx方法指定计算类型,通过steXxx方法设置计算中值的变化方式,产生一段有规律的数字,让开发者自己为指定对象动态的设置属性。

ObjectAnimation

ObjectAnim类继承了ValueAnimation类,可以直接将ValueAnimation计算出来的值应用到指定对象的指定属性上。

ObjectAnimator animator = ObjectAnimator.ofFloat(imageView, "translationX", 0,500);

animator.setDuration(2000);

animator.start();

复制代码

ofFloat方法与ValueAnimation中不同的是第一个参数是执行动画的对象,第二个参数是需要操作的属性,后面是一个可变长数组,表示属性值的起始于终止值。

第二个参数需要操作的属性在第一个参数对象中需要有get和set方法。ObjectAnimation内部是通过反射机制获得set方法动态的设置对象属性。可以直接使用的的属性有:

translationX、translationY:这两个属性作为一种增量来控制着View对象从它布局容器的左上角坐标开始的位置。

rotation、rotationX、rotationY:这三个属性控制着View对象围绕它的支点进行2D和3D的旋转。

scaleX和scaleY:这两个属性控制着View对象围绕它的支点进行2D缩放。

pivotX和pivotY:这两个属性控制着View对象的支点位置,围绕这个支点进行旋转和缩放变换处理。默认情况下,该支点的位置就是View对象的中心点。

alpha:它表示View对象的alpha透明度。

x、y:这是两个简单的实用的属性,它描述了View对象在它的容器中最终的位置。

AnimationSet

那么多炫酷的动画,当然不可能只是靠单一一个ObjectAnimation来实现的,这就需要多个ObjectAnimation进行组合,就需要AnimationSet类了。

AnimatorSet animatorSet = new AnimatorSet();

ObjectAnimator animator1 = ObjectAnimator.ofFloat(imageView, "translationX", 0,500);

ObjectAnimator animator2 = ObjectAnimator.ofFloat(imageView, "translationX", 0,500);

ObjectAnimator animator3 = ObjectAnimator.ofFloat(imageView, "translationX", 0,500);

ObjectAnimator animator4 = ObjectAnimator.ofFloat(imageView, "translationX", 0,500);

animatorSet.play(animator1).after(animator2).with(animator3).before(animator4);

animatorSet.setDuration(2000);

animatorSet.start();

复制代码

AnimationSet的play方法表示播放当前动画,其余还有组合方法:

after(Animator anim) : 将现有动画插入到传入的动画之后执行。

after(long delay):将现有的动画延迟指定的毫秒后执行。

before(Animator anim):将现有的动画插入到传入的动画之前执行。

with(Animator anim):将现有的动画和传入的动画同时执行。

playSequentially(Animator... items):表示按顺序执行这些动画.

playTogether(Animator... items);表示这些动画一起执行.

区别

属性动画在补间动画的基础上定义了更多高级的功能

补间动画只能对UI组件执行动画,但属性动画几乎可以对任何对象执行动画,不管它是否显示在屏幕上

最重要的一点:补间动画只是在视图层次进行了改变,对象的属性并没有改变。而属性动画是真正的改变了属性值,根据设置动态的属性值实现动画效果。一个很好的例子就是一个图片在采用补间动画进行平移后,点击平移后的图片是不会有点击事件发生,点击平移前的位置会有点击事件发生(虽然执行动画后这里看起来什么也没有)。而属性动画则会对新位置响应点击事件。

android 属性动画 补间动画,每日一道面试题(第7期)---Android补间动画与属性动画的区别...相关推荐

  1. 每日一道面试题(第7期)---Android补间动画与属性动画的区别

    零零碎碎的东西总是记不长久,仅仅学习别人的文章也只是他人咀嚼后留下的残渣.无意中发现了这个每日一道面试题,想了想如果只是简单地去思考,那么不仅会收效甚微,甚至难一点的题目自己可能都懒得去想,坚持不下来 ...

  2. 网易云音乐android面试题,# 每日一道面试题 # 如何测试网易云音乐 app 语音识别功能?...

    个人暂时想到的,大家也来讨论下~ 1.针对输入源来测试: (1)用户正常比较标准的哼唱,查看识别结果,并且能够点播: (2)用户加了特效的哼唱,比如加了电音效果,查看识别结果: (3)用户的哼唱咬字不 ...

  3. 每日一道面试题:Vue 组件间通信有哪几种方式?

    Vue 组件间通信有哪几种方式? 父子组件通信.隔代组件通信.兄弟组件通信 (1)props / $emit适用 父子组件通信 - 这种方法是 Vue 组件的基础,相信大部分同学耳闻能详,所以此处就不 ...

  4. “每日一道面试题”.Net中所有类的基类是以及包含的方法

    闲来无事,每日一贴.水平有限,大牛勿喷. .Net中所有内建类型的基类是System.Object毋庸置疑 Puclic Class A{}和 Public Class A:System.Object ...

  5. 每日一道面试题之try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

    finally代码段不是必须有的,但是如果有该代码段,必须紧跟在最后一个catch代码段后面,作为异常处理机制的统一出口(做善后处理),例如资源的关闭,无论try中是否产生异常,finally中的代码 ...

  6. 自定义控件三部曲之动画篇(一)——alpha、scale、translate、rotate、set的xml属性及用法...

    前言:这几天做客户回访,感触很大,用户只要是留反馈信息,总是一种恨铁不成钢的心态,想用你的app,却是因为你的技术问题,让他们不得不放弃,而你一个回访电话却让他们尽释前嫌,当最后把手机号留给他们以便随 ...

  7. 自定义控件三部曲之动画篇(一)——alpha、scale、translate、rotate、set的xml属性及用法

    相关文章: <Android自定义控件三部曲文章索引>:http://blog.csdn.net/harvic880925/article/details/50995268 一.概述 An ...

  8. android 延时播放动画,HollyTransition: 让APP丝滑般流畅:深入解读Android过渡动画Transition. 共享元素动画、场景动画、过场动画、延时动画...

    HollyTransition 零.导读 深入解读Android过渡动画Transition: 页面切换动画(过场动画) 共享元素动画 延时动画 场景动画 一.Transition前世今生 为了支持各 ...

  9. CSS3变形和动画:旋转、扭曲、缩放、位移、矩阵 、原点 transform-origin、过渡属性 transition-property、过渡所需时间 transition-duration...

    无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家.教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家.点这里可以跳转到教程. 旋转.扭曲.缩放.位移.矩阵 ...

最新文章

  1. jBPM 流程设计器和查看【包括Web形式】的总结
  2. 中石油训练赛 - Get Strong(dfs双向搜索+二分)
  3. 叮,您有一份ML.NET 速查手册请查收!
  4. unix网络编程之UNIX Domain Socket IPC (sockaddr_un )
  5. 如何用JavaScript判断客户端浏览器是否安装了Flash插件,及其版本
  6. GB/T 28448-2019 《信息安全技术 网络安全等级保护测评要求》之安全通信网络测评解读
  7. python ttf font weight_使用FontCreator将ttf字体制作多字重字体并打包为Magisk字体模块...
  8. git入门-----远程操作相关命令(remote 、push、fetch 、pull)
  9. [DAX] FORMAT函数
  10. python画条状图_Python 绘制分组条形图
  11. VRP基础(华为设备操作系统)
  12. 多波段影像 tif转为jpg(png)
  13. Revit API:View 视图概述
  14. MIUI系统 无法从非官方渠道安装系统应用
  15. 神经网络模型 基本概念 一文看懂
  16. How to use segment advisor
  17. 解决树莓4B motion 卡顿
  18. 基于JSP的JAVA email邮件系统研发
  19. 【5G核心网】控制面与用户面协议栈
  20. APP测试基本流程以及APP测试要点梳理,不看了不后悔系列!

热门文章

  1. oracle报609,ORA-609 错误分析及解决方法
  2. distcc 链接失败_distcc分布式编译时,icu host程序偶现编译失败原因分析
  3. linux中安装redis
  4. mysql的压缩包安装_mysql 5.7.24 压缩包安装配置方法图文教程
  5. 基于JAVA+SpringMVC+Mybatis+MYSQL的仓库物品管理系统
  6. Spring Boot-热部署和Debugger使用(三)
  7. 论 BUG调试与(程序猿)初学者
  8. POJ 3253-Fence Repair(堆)
  9. 对于PHP大型开发框架的看法
  10. 46 - 算法 -Leetcode 168 -位运算 类型模拟倒序利用vector