android动画具体解释四 创建动画
使用ValueAnimator进行动画
通过指定一些int, float或color等类型的值的集合。ValueAnimator 使你能够对这些类型的值进行动画。你需通过调用ValueAnimator 的某个工厂方法来获得一个ValueAnimator 对象。比方:ofInt(), ofFloat(), 或 ofObject()。比如:
ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);
animation.setDuration(1000);
animation.start();
此段代码中,当start()方法运行时,開始计算在1000 ms中处于0和1之间的动画的值。
你也能够按下面方式指定一个自己定义类型来进行动画:
ValueAnimator animation = ValueAnimator.ofObject(new MyTypeEvaluator(), startPropertyValue, endPropertyValue);
animation.setDuration(1000);
animation.start();
在此段代码中, ValueAnimator 在 start() 方法运行时,開始计算在1000 ms 中处于startPropertyValue 和endPropertyValue 之间的动画的值,使用MyTypeEvaluator 提供的计算逻辑。
然而,在上面代码片段中,实际上对对象没有不论什么影响。由于ValueAnimator 不直接操作对象或属性。你应该自己跟据所计算出的值自己改动对象。你能够定义一个监听器来处理动画过程中ValueAnimator的重要事件们,比方更新帧。
当实现了监听器们。你就能够在帧刷新时通过调用getAnimatedValue()获得动画的值。
使用ObjectAnimator进行动画
ObjectAnimator 是ValueAnimator 的一个子类而且合并了时间引擎和ValueAnimator的计算能力来动画一个对象的属性,这个属性通过名字指定。
这使得动画一个对象更加easy,由于你不再须要实现ValueAnimator.AnimatorUpdateListener,由于要动画的属性是自己主动更新的。
实例化ObjectAnimator 和实例化ValueAnimator非常类似,可是你还须要指定对象和对象的属性的名字:
ObjectAnimator anim = ObjectAnimator.ofFloat(foo, "alpha", 0f, 1f);
anim.setDuration(1000);
anim.start();
要使ObjectAnimator 能正确的更新属性。你必须按下面去做:
· 你要动画的对象的属性必须具有一个setter函数,像这个样子:set<propertyName>()。 由于 ObjectAnimator 在动画期间会自己主动更新属性,必须能通过此setter方法操作目标属性。比如,假设属性的名字是foo,你必须具有一个setFoo()方法。假设此方法不存在,你有三个选择:
· 假设能够,你自己加入setter方法(废话)。
· 用另外一个类封装此对象的类,于是你就有了改写权力了。在封装类中加入操作原始类的属性的setter。
· 改用 ValueAnimator。
· 假设在ObjectAnimator 的某个工厂方法中,你仅仅指定了一个values...參数。这个參数就被视为动画的结束值。
因此,你动画的对象属性必须具有一个getter方法,用于获取開始值。getter方法必须具有get<propertyName>()样的格式。
比如。假设属性名是foo,你须要带有一个getFoo()方法。
· 你要动画的属性的getter (假设须要)和setter方法处理的数据类型必须跟你为ObjectAnimator指定的開始和结束值的类型同样。比如,假设你创建例如以下的ObjectAnimator,你必须具有targetObject.setPropName(float)方法和targetObject.getPropName(float)方法:
ObjectAnimator.ofFloat(targetObject, "propName", 1f)
· 跟据动画的对象和属性的不同。你可能须要调用View的invalidate()方法来强制屏幕使用新的动画数据重绘自己。你应在onAnimationUpdate() 回调中这样做。比如。动画一个Drawable对象的color属性导致仅在对象重绘自己时才更新屏幕。View的全部的属性setter,比方setAlpha()和setTranslationX(),都会使View无效,所以你不须要在调用这些方法时使View无效 。
使用AnimatorSet组合多个动画
非常多情况下,你可能想播放一个动画,它的播放时机依赖于其他动画的開始时间或结束时间。Android系统同意你绑定多个动画到一个AnimatorSet中,于是你能够指定是否同一时候播放。或分别播放。或某个延迟后再播放。你还能够相互嵌套各AnimatorSet对象。
下面的演示样例代码是从样例Bouncing Balls 中拿来的 (小改了一下下)。它以这种方式播放下列动画对象:
1. 播放 bounceAnim.
2. 同一时候播放 squashAnim1, squashAnim2, stretchAnim1, 和 stretchAnim2 。
3. 播放 bounceBackAnim.
4. 播放 fadeAnim.
AnimatorSet bouncer = new AnimatorSet();
bouncer.play(bounceAnim).before(squashAnim1);
bouncer.play(squashAnim1).with(squashAnim2);
bouncer.play(squashAnim1).with(stretchAnim1);
bouncer.play(squashAnim1).with(stretchAnim2);
bouncer.play(bounceBackAnim).after(stretchAnim2);
ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
fadeAnim.setDuration(250);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(bouncer).before(fadeAnim);
animatorSet.start();
android动画具体解释四 创建动画的更多相关文章
- android动画具体解释二 属性动画原理
property动画是一个强大的框架,它差点儿能使你动画不论什么东西. 你能够定义一个动画来改变对象的不论什么属性,不论其是否被绘制于屏幕之上. 一个属性动画在一定时间内多次改变一个属性(对象的一个字 ...
- android动画具体解释一 概述
动画和图形概述 Android 提供了大量的强大的API以应用于UI动画和绘制2D和3D图形.以下各节向你描写叙述了这些API的预览和系统能力以帮助你决定怎么才是达到你需求的最佳方法. 动画 Andr ...
- cocos2dx中创建动画的三种方法
1.最最原始的方法,先创建动画帧,再创建动画打包(animation),再创建动画(animate) 第一步: 创建动画帧:CCSpriteFrame,依赖于原始的资源图片(xx.png,xx.jpg ...
- ios基础动画、关键帧动画、动画组、转场动画等
概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画 ...
- ReactNative学习实践--动画初探之加载动画
学习和实践react已经有一段时间了,在经历了从最初的彷徨到解决痛点时的兴奋,再到不断实践后遭遇问题时的苦闷,确实被这一种新的思维方式和开发模式所折服,react不是万能的,在很多场景下滥用反而会适得 ...
- Android基础笔记(十)- 帧动画、补间动画具体解释、对话框
帧动画 补间动画Tween Animation 对话框以及面试中的注意点 帧动画 帧动画非常easy,我们首先看一下Google官方解释This is a traditional animation ...
- android 动画具体解释(二)
以下就開始学习属性动画的基本使用方法,我们来看属性动画的继承关系,例如以下如所看到的: 显然关注的焦点应该是ValueAnimator,ObjectAnimator这两个类啦,ObjectAnimat ...
- Android图文具体解释属性动画
Android中的动画分为视图动画(View Animation).属性动画(Property Animation)以及Drawable动画.从Android 3.0(API Level 11)開始. ...
- Android中的动画具体解释系列【4】——Activity之间切换动画
前面介绍了Android中的逐帧动画和补间动画,并实现了简单的自己定义动画.这一篇我们来看看怎样将Android中的动画运用到实际开发中的一个场景--Activity之间跳转动画. 一.定义动画资源 ...
随机推荐
- 树莓派搭建Seafile个人网盘
步骤一.安装Seafile依赖包 yum install python-setuptools python-ldap python-memcached MySQL-python mariadb mar ...
- 枚举(enum)的使用
在开发中我们经常会遇到一些特殊的字段,比如订单状态.支付状态.类型等,这些特殊字段在编码开发的时候,可以写成枚举类型.接下来还是看Demo吧! public enum AuditState { Wai ...
- Go:类型断言
一.基本介绍 类型断言:由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言. 如果希望将一个空接口类型重新转换成对应的类型,那么需要使用类型断言,能转换成功是因为这个空接口原先 ...
- python 容器 用户注册登录系统
1. 列表和普通变量有什么区别 列表是数据类型,普通变量是用来存储数据的 可以把列表赋值给普通变量 2.存在列表 a = [11, 22, 33], 如何向列表中添加(增)新元素 44 a.appen ...
- POJ 2342 Anniversary party (树形DP入门)
题意: 给定一个上下属的关系树, 每个人有一个活跃值, 现在要参加一个派对, 每个人都不会和自己的上属参加派对(上属参加了,下属就不能参加了), 求参加派对的最大活跃值 分析: 枚举每个节点取与不取得 ...
- cf837d Round Subset
设dp[i][j][k]表示前i个数中选j个并且因子含有k个2的能获得的最多的5的个数 则dp[i][j][k]=max(dp[i-1][j][k],dp[i-1][j-1][k-cnt2]+cnt5 ...
- robotframework使用requestsLibrary进行接口测试
一.定义 接口测试:接口测试通常是系统之间交互的接口,或者某个系统对外提供的一些接口服务 分类:RESTful.webservice接口 二.安装 进入C:\Pyhon27\scripts 先要安装r ...
- MySQL语句之or和and多条件查询
在where中可以包含任意数目的and和or操作符,需要注意的是在没有任何其他符号的时候,例如括号,AND的优先级高于OR,因此,当两者一起使用时,先运算AND两边的条件表达式,再运算OR两边的条件表 ...
- 公钥加密算法那些事 | RSA 与 ECC 系统对比
一.背景 据记载,公元前 400 年,古希腊人发明了置换密码.1881 年世界上的第一个电话保密专利出现.在第二次世界大战期间,德国军方启用「恩尼格玛」密码机,密码学在战争中起着非常重要的作用. 随着 ...
- hdu 3732
#include<stdio.h> #include<string.h> int n,m,dp[10001]; int max(int a,int b) { return a ...