动画深入研究

前言

分类

View动画,帧动画,自定义View动画,属性动画

View动画

平移,缩放,旋转,透明
TranslateAnimation,ScaleAnimation,RotateAnimation,AlphaAnimation
注意的概念有interpolator插值器(控制动画执行速率),轴点,fillAfter动画完成后是否停留在结束位置.
XML与代码中定义动画,让控件执行动画,通过setAnimationListener给View动画添加过程监听。
xml定义的使用Animation animation = AnimationUtils.loadAnimation(context, R.anima.xxx);
mButton.startAnimatioin(animation)
代码定义直接new AlphaAnimation(0,1);
再设置属性完成动画效果控制。

帧动画

通过AnimationDrawable来使用帧动画,将Drawable作为View的背景来播放动画。
避免使用较大的图来做动画的帧造成OOM

自定义View动画

继承Animation抽象类,重写initialize和applyTransformation方法。
基本原理是利用数学的矩阵变换.应用场景少,遇到再深究

View动画的特殊使用场景

不同Activity之间的切换效果

在startActivity(Intent)或finish()后使用overridePendingTransition(int, int)可以设置Activity的切换动画。且必须在这两方法后使用。

Fragment也可以设置切换动画。通过FragmentTransaction中的setCustomAnimations()设置动画。且只能是View动画。Api不支持属性动画。Activity支持但是使用就黑屏,这个需要去探究原因。

实验Fragment的时候连Fragment怎么调都忘记了,记得面试遇到过文它与Activity的区别。但是用得实在少,加上这段时间这弄php,产品,项目管理,linux运维这类的事情。Android手生了。"鸿洋Fragment完全解析上"

系统提供了一些内置动画,如:android.R.anim.fade_in

LayoutAnimation布局子元素出场效果

LayoutAnimation作用于ViewGroup,为ViewGroup指定一个动画,这样当它的子元素出场时都会具有这种动画效果。
在ListView或者RecyclerView的时候效果不明显,因为View是复用的。

属性动画基础

属性动画根据时间变化来改变对象的属性来实现绚丽的动画。比View动画更加灵活,适用性更加广泛,不局限于动画。对象的属性,或者某些值根据时间变化而变化的都可以应用。

分为ValueAnimator、ObjectAnimator、AnimatorSet。ObjectAnimator继承自ValueAnimator。AnimatorSet是动画集合。ObjectAnimator比ValueAnimator新增能够对对象进行操作。

用XML定义对应的标签是animator,objectAnimator,set.定义在res下的animator目录。

要注意的属性
set:
ordering有两个可选值:"together"和"sequentially",表示"同时播放"和"顺序播放"。

objectAnimator:
propertyName,表示属性名称,只有objectAnimator有。animator是没有的。
repeatCount,表示动画重复次数,-1表示无限循环。
repeatMode,表示动画的重复模式。"restart"和"reverse",表示"连续重复"和"逆向重复"。
valueType,表示propertyName所指定属性的类型,有"intType"与"floatType".
如果属性表示的是颜色,不需要指定valueType,系统会自动对颜色类型的属性做处理。

使用XML动画:

AnimatorSet set = (AnimatorSet)AnimatorInflater.loadAnimator(myContext, R.animator.property_animator);
set.setTarget(mButton);
set.start();

使用代码比XMl要简单,如:

ObjectAnimator.ofFloat(myObject, "translationY", -myObject.getHeight()。

插值器(Interpolator)与类型估值算法(TypeEvaluator)

插值器是根据时间的流逝,在动画持续时间内,计算出目标值改变的百分比。
常见的有:时间插值器(TimeInterpolator),线性插值器(LinearInterpolator),减速插值器(Decelerate-Interpolator),加速减速插值器(AcclerateDecelerateInterpolator)
估值器是根据目标值改变的百分比与内部的估值算法计算出某时间点的目标值。
系统预置的有:IntEvaluator与FloatEvaluator和ArgbEvaluator(针对颜色值)。
除这3种外,要对其他类型做动画,那么必须自定义估值算法。继承TypeEvaluator.
可自定义插值器与估值算法完成自定义的属性动画。

监听器(AnimatorListener与AnimatorUpdateListener接口)

AnimatorLister接口有四个方法:
1.onAnimationStart(Animator animator)
2.onAnimationEnd(Animator animator)
3.onAnimationCancel(Animator animator)
4.onAnimationRepeat(Animator animator)

AnimatorUpdateListener接口只有一个方法onAnimationUpdate.它在动画每个帧播放的时候就会被调用一次。

属性动画的工作原理

(1)属性的set必须有,get方法如果没提供初值也必须有,否则Crash。属性动画会在用到的时候利用反射机制调用。
(2)对属性做的改变如果不体现在UI上是没有动画效果,但是属性值已经改变。
(3)如果对象的set与get方法不是操作我们理性的属性值,可以通过以下三个途径解决:
1.给你的对象加上get与set方法,如果你有权限的话。
2.用一个类来包装原始对象,间接为其提供get与set方法;
3.采用ValueAnimator,监听动画过程,自己实现属性的改变。

属性动画必须运行在有Looper的线程。不一定是要主线程吗?

使用动画的注意事项

1.帧动画的OOM
2.内存泄露,无限循环的动画,要在Activity退出时停止,最好是onPause就停止。否则会导致Activity无法释放内存。有人验证过,View动画并不存在此问题。
3.View动画可能会造成完成动画后View的Gone失效。需要调用view.clearAnimation()清除View动画。
4.尽量使用dp而不是px
5.View动画注意fillerAfter设置是否停留在动画完成的位置,触发单机事件是否有效等问题。
6.使用动画,建议开启硬件加速

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

推荐阅读更多精彩内容

  • 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让全面说说Android的动画,所以今...
    未聞椛洺阅读 2,711评论 0 10
  • 转载一篇高质量博文,原地址请戳这里转载下来方便今后查看。1 背景不能只分析源码呀,分析的同时也要整理归纳基础知识,...
    Elder阅读 1,943评论 0 24
  • 最近写文章都是写到一半 就没有了灵感,感觉需要更多的时间来慢慢沉淀自己的文字功底。 也许是受环境的影响,写文章的时...
    静静地聆听Yang阅读 163评论 0 1
  • mysql-sql 语句 字符集选utf-8 我需要学增删改查, 事物, 联合 启动数据库 mysql -u ro...
    sunningcarry阅读 1,191评论 0 1
  • 服毒,偽命題 2017年的四月,沒有“四月物語”,苦悶的時間再一次侵襲了我。面對生活之抉擇,沒有一絲一毫的痛快。迫...
    好嚎滴阅读 212评论 0 0