Android属性动画

说起属性动画或许对Android开发的你来说并不陌生,但是你了解它背后的原理吗?接下来我就把自己的一些见解罗列出来,希望能和你共勉!

首先我们就从属性动画的基本用法说起:

val view = findViewById(R.id.view)

view.animate()

.translationX(150F)

.alpha(0.5F)

.rotation(180F)

.scaleX(1.2f)

.scaleY(1.2f).apply {

        duration =1000

        startDelay =1000

        start()

}

通过上面的代码你就能实现系统自带的一些属性动画了。和上上面代码同样的另外的动画的组合方式还有如下:

val view = findViewById(R.id.view)

val translationX = PropertyValuesHolder.ofFloat("translationX", 0F, 180F)

val alpha = PropertyValuesHolder.ofFloat("alpha", 0F, 0.5F)

val rotation = PropertyValuesHolder.ofFloat("rotation", 0F, 180F)

val scaleX = PropertyValuesHolder.ofFloat("scaleX", 0F, 1.2F)

val scaleY = PropertyValuesHolder.ofFloat("scaleY", 0F, 1.2F)

ObjectAnimator.ofPropertyValuesHolder(view, translationX, alpha, rotation, scaleX, scaleY).apply {

    duration =1000

    startDelay =1000

    start()

}

这种方式可以和上面的效果相同,另外PropertyValuesHolder还可以持有写关键帧(Keyframe),通过修改这些不同阶段的Keyframe的值也可以实现不一样的动画,有兴趣的可以自己了解一下。

上面这种方式是单个和组合都能够执行,但是我想一个动画结束之后再执行另一个动画总不能整出好几个ViewPropertyAnimator对象依次执行吧,别着急接下来我们就开始介绍AnimatorSet。从名字你大概就能猜出这个AnimatorSet是干什么的了,不错它就是一些类动画的集合,然后我们可以单独定制各个动画的方式,其中有几个重要的方法简单介绍一下:

首先就是AnimatorSet.play()方法,点进去居然是

AnimatorSet.play()方法

看到这个我们应该想到它可能内部实现了一个动画的队列,通过这个队列判断下一个需要执行的动画,在这里我们暂时不关注它的源码是怎么实现的;接着看一下AnimatorSet的其它相关方法playTogether()方法和playSequentially()方法,一个是同时执行一个是依次执行,源码如下图:

AnimatorSet.playTogether()方法


AnimatorSet.playSequentially()方法

通过上述方法我们就能够向AnimatorSet中添加我们想要的动画效果和执行顺序了,最后我们调用AnimatorSet的stary()方法,动画就能播放起来了,当然了这个过程中还能加入Interpolator,AnimatorListener和AnimatorUpdateListener这个添加监听和插值器的过程在这就不做介绍了。

接下来就到了重点了我们怎么自定义自己的属性动画呢,毕竟系统提供给我们的动画并不是很丰富,但是开发过程中的动画需求通过系统自带的动画又很难实现效果,那么系统有没有提供一种方法让我们自定义属性来达到丰富的动画效果呢?就像自定义View一样,通过一些固定的流程实现我们自己的动画效果。接下来我们就来自己书写一个自定义的属性动画,代码如下图:

自定义的属性动画代码

上述代码我们自定义了一个changAngle的属性,在onDraw()方法中我们通过改变这个属性的值达到每次绘制的内容是随着changAngle的变化而变化。有细心的读者可能会发现你这个setChangeAngle()方法怎么多了invalidate(),没错就是调用了这个invalidate()方法使得我们的当前视图无效,等待下一次UI重新渲染我们的界面,使得我们的界面得到刷新。然后我们就能通过调用下图方法就能实现动画效果:

调用自已的自定义属性动画

好了到这里我们就能简单实现一个自定义的属性动画了;接下来我们来梳理一下注意点:1,首先我们需要根据需求自定义出相应的动画属性;2,给我们的属性设置相应的get()和set()注意set()方法需要调用invalidate(),3,我们就按照平常的属性动画就能操作自定义的动画了。


效果图

最后我想说的是自定义属性动画可以自定义任意类型的数据,我们例子中列举的是float类型的变量,其实属性动画支持的类型是object类型的,相信这也是为什么属性动画的类ObjectAnimator名字的由来,寓意就是支持任意类型的动画,需要了解的可以自行了解一下ObjectAnimator类中ofObject()的方法,相信会给你带来惊喜,如下图:

任意类型的属性动画

好了,属性动画的自定义就介绍到这里,希望能够帮助到你,内容组织不合理的地方希望大家见谅,欢迎大家留言交流,内容如有雷同纯属巧合。

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

推荐阅读更多精彩内容