Android 动画之属性动画(二)

Android 动画之属性动画(二)#


在这篇文章中将会通过介绍属性动画的具体使用

Animating with ValueAnimator##

首先需要获得一个ValueAnimator对象,它的获取方法是通过调用它的Factory Method: ofInt(int... values)ofFloat(float... values)ofObject(TypeEvaluator evaluator, Object... values) (int... values 表示传入的参数个数是任意的)

更多关于 ValueAnimator 的方法请查看文档:
https://developer.android.com/reference/android/animation/ValueAnimator.html

ValueAnimator mValueAnimator = ValueAnimtor.ofInt(0,10);

//ValueAnimator mValueAnimator = ValueAnimtor.ofInt(0,10,8,20);
这样的意思是说从0过渡到10,然后在过渡到8,再过渡到20

mValueAnimator.setDuration(200);
mValueAnimator.setInterpolator(new LinearInterpolator());//设置均匀计算数值
mValueAnimator.start();//通过start()来开始动画

在上面的代码中,在start()方法启动后,ValueAnimator就会在200ms内,均匀地计算出0到10的int值,我们通过监听器来获取这些值,看看是否如上所描述的一样

D/TAG: current value is 0
D/TAG: current value is 2
D/TAG: current value is 3
D/TAG: current value is 4
D/TAG: current value is 5
D/TAG: current value is 5
D/TAG: current value is 6
D/TAG: current value is 7
D/TAG: current value is 8
D/TAG: current value is 9
D/TAG: current value is 10

可以看到基本是均匀增加的,出现误差的原因之前已经讲过,理论上来是每10ms更新一次,但是具体是取决于手机本身所能提供的计时器,因此这里我们看到的是接近每20ms更新一次,而且系统本身计时存在误差,因此也就出现了误差

如果你想要进行动画的既不是整数值也不是浮点数值,那么就要用到 ofObject(TypeEvaluator evaluator, Object... values) ,比如说

ValueAnimator animation = ValueAnimator.ofObject(new MyTypeEvaluator(), startPropertyValue, endPropertyValue);
animation.setDuration(1000);
animation.start();

其中MyTypeEvaluator就是你自己定义的一个类型 ValueAnimator 只是为需要动画的属性提供一组平滑过渡的值,所以之后要需要为动画设置 监听 来得到这些值,然后在对具体的属性/对象利用这些值进行操作,有关 监听 的内容将在后面提到

Animating with ObjectAnimator

通常情况下我们用到更多的是 ObjectAnimator ,因为它可以直接指定你要进行动画的属性/对象。它的初始化方法和 ValueAnimator 的类似,不过它的方法中多了两个参数:ofFloat(Object target, String propertyName, float... values) ,第一个参数为你要进行动画的对象,第二参数为你要进行动画的属性值,比如说对象是一个TextView,你需要改变TextView的透明度这个属性.

ObjectAnimator anim = ObjectAnimator.ofFloat(mTextView, "alpha", 0f, 1f);
anim.setDuration(1000);
anim.start();

更多关于 ObjectAnimator 的方法请查看文档
https://developer.android.com/reference/android/animation/ObjectAnimator.html

要非常注意的一点是, ObjectAnimator 自动修改alpha其实是调用了TextView里面 setAlpha() 这个方法!因此,要对某一属性进行动画,那么目标对象一定要有 set< propertyName >() 这个方法

我们来一起验证一下是否是这样:
(1). 先来创建一个自定义的View,命名为myView,继承自TextView
(2). 对它的透明度属性进行动画操作,一开始先不重写 setAlpha() 这个方法,来看看效果

ObjectAnimator anim = ObjectAnimator.ofFloat(myview,"alpha",0f,1f);
anim.setDuration(1000);
anim.start();

----------

@Override
public void setAlpha(float alpha) {
    super.setAlpha(alpha);
}

(3). 然后我们重写 setAlpha() 这个方法,让他变成位移,看看效果

    @Override
    public void setAlpha(float alpha){
    super.setTranslationX(alpha*200);
    }

可以看出,确实是调用了 myView 里面的setAlpha()方法

假如你想要改变的属性没有对应的set方法,官方给出了这三种解决方法:

  • 假如你有修改这个对象的权限,那么你可以为这个对象添加setter方法
  • 使用一个你有权限去修改的 wrapper 类然后让这个 wrapper 类利用一个有效的setter方法来接收value,然后传递给对象
  • ValueAnimator 来替代

Choreographing Multiple Animations with AnimatorSet

很多情况下你不仅需要一个动画来满足你的需求,所以,你会要用到利用 AnimatorSet 类。它可以吧几个动画捆绑在一起,这样就可以控制这些动画是同时进行还是有序进行或者其他的。 AnimatorSet 可以互相嵌套。

Animator 加到 AnimatorSet 里面有两种方法:
(1). 利用 playTogether()playSequentially() ,一次处理完所有 Animator

//假设前面已经创建了若干ValueAnimator/ObjectAnimator
anim1,anim2,anim3

//实例化一个AnimatorSet
AnimatorSet aniset = new AnimatorSet();
//调用 playTogether (Animator... items)
aniset.playTogether(anim1,anim2,anim3);

//你可以把这三个动画编成一个集合再调用
playTogether(Collection<Animator> items),这里就不再演示 

(2). 利用 Builder 里面的 play(),after(),before(),with() 方法来逐个添加动画,参数都是 Animator

 AnimatorSet s = new AnimatorSet();
 s.play(anim1).with(anim2);
 s.play(anim2).before(anim3);
 s.play(anim4).after(anim3);

需要注意的是,AnimatorSet 最先使用的一定是 play() 因为只有 play() 的参数才是所有它紧接着的那个动画的主语,比如上面代码的第3行,before表示在之前发生,anim2 是主语,所以意思是 before(anim3) 的主语是 anim2anim2 将会在 anim3 发生前发生。再比如:

AnimatorSet s = new AnimatorSet();
s.play(anim1).before(anim2).before(anim3);

这里无论是 before(anim2) 还是 before(anim3) 都是对于 anim1 来说的,所以在 anim1 结束后, anim2anim3 会同时开始。

更多关于 AnimatorSet 的方法请查看文档
https://developer.android.com/reference/android/animation/AnimatorSet.html#AnimatorSet()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容