前言
国内的Android大部分应用不重视页面的简洁,而且业务逻辑是越攒越多,最终成为一个庞然大物,这个趋势必然不会在意界面的炫酷,但是今天我浅记一下炫酷之动画,Android自3.0以前只有逐帧动画和补间动画,在3.0以后新增了ObjectAnimator(属性动画),在5.0以后又新增了一系列好看的MD风格动画,当然期间不缺乏一些好用的非官方动画框架譬如nineoldandroids,但是由于接下来的出场率不高暂且不谈,接下来我们当简谈下列举的动画,在开谈前还得郑重的提醒句,代码中动态创建的动画一定要注意退出,否则动画所造成的内存泄漏比Bitmap还can忍,它貌似会持续增高。
工具:AS 2.3.1 编译版本:api 25 构建版本:gradle2.3.1
- 逐帧动画(Frame Animation)
- 补间动画(Tween Animation)
- 属性动画(Property Animation ) 3.0后新增
- MateriaDesign
1.Touch feedback(触摸反馈)
2.Reveal effect(揭露效果)
3.Activity transitions(转场动画实在有很多,最出名的莫属共享元素)
4.Curved motion(曲线运动)
5.View state changes (视图状态改变)
6.Animate Vector Drawables(可绘矢量动画) - Lottie(多端支持的未来方向动画)
逐帧动画(Frame Animation)
逐帧动画其实学过Flash的同学绝对不陌生,我们对每一帧设置一个动作,然后连贯的播放起来,这里在Android也是可以这么理解的,做法很简单,平时我们只需要找美工要一个动作的几张分解图,然后XXX就好了,下面来一发例子。
![](https://img.haomeiwen.com/i9009142/b96b3ab965390b67.gif)
首先呢我们就先找一些图片这种东西不是稀缺货,就像下面这个,共有12张。
![](https://img.haomeiwen.com/i9009142/db040d540435db75.png)
代码怎么写呢?
第一步:我们在xml静态文件中配置这些东西,下面的注释很重要、很重要、很重要我说三遍。
<?xml version="1.0" encoding="utf-8"?>
<animation-list android:oneshot="false"
xmlns:android="http://schemas.android.com/apk/res/android">
<!--
说明:android:oneshot="false"此属性为false则表示此逐帧动画将会循环执行,一般我们使用为循环执行。
注:经实际操作发现:
1.此处item无法引用mipmap文件夹下的图片,动画图片只能放置在drawable下面。
2.此文件只可放置在drawable文件夹下,anim文件夹下无animation-list标签会报错,百度上有人说可随意放置在anim或者drawable文件夹下,
或许是工具版本有差异,反正官方放置在drawable文件夹下,而我们现在别无选择。-->
<item android:drawable="@drawable/ic_loading_white_01" android:duration="100" />
<item android:drawable="@drawable/ic_loading_white_02" android:duration="100" />
<item android:drawable="@drawable/ic_loading_white_03" android:duration="100" />
<item android:drawable="@drawable/ic_loading_white_04" android:duration="100" />
<item android:drawable="@drawable/ic_loading_white_05" android:duration="100" />
<item android:drawable="@drawable/ic_loading_white_06" android:duration="100" />
<item android:drawable="@drawable/ic_loading_white_07" android:duration="100" />
<item android:drawable="@drawable/ic_loading_white_08" android:duration="100" />
<item android:drawable="@drawable/ic_loading_white_09" android:duration="100" />
<item android:drawable="@drawable/ic_loading_white_10" android:duration="100" />
<item android:drawable="@drawable/ic_loading_white_11" android:duration="100" />
<item android:drawable="@drawable/ic_loading_white_12" android:duration="100" />
</animation-list>
第二步:既然是动画就需要动那就那啥。。。需要播放出来,我实际操作在onCreate周期方法中
ImageView imgView = (ImageView) findViewById(R.id.img);
AnimationDrawable animDrawable = (AnimationDrawable) getResources().getDrawable(R.drawable.frame_animation);
animDrawable.setOneShot(false);
imgView.setBackground(animDrawable);
animDrawable.start();
这里需要注意的就是有博客说此处可能会遇到一个bug,就是控件只显示第一帧,据说是Window对象未初始化完成,无法添加动画载体控件的对象所致,这我无法辨别真假,暂且相信为一个低概率事件,出现时就把我上面操作动画的代码放到onWindowFocusChanged系统方法里面吧,反正我是遇到只显示第一帧,不过只是因为没有animDrawable.start();这里还得鄙视一下那些没有在onDestroy或者在onPuse等周期方法中销毁动画的人,始乱终弃,动画所造成的内存泄漏是你承担不起的,不起的,起的,嘀嘀嘀嘀嘀嘀嘀。
if(animDrawable.isRunning()){
animDrawable.stop();
}
水波纹(触摸反馈)
参考例子别忘了这个http://blog.csdn.net/u012209506/article/details/72833936
共享元素动画 http://blog.sina.com.cn/s/blog_7452896e0102vdko.html(可做参考写)
共享元素这个东西真的很炫酷,这里不做详细探究,只记用法
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(MailDetailsActivity.this, view, "look");
startActivity(intent,options.toBundle());
目标控件加上android:transitionName="look"
即可完成转场动画
2者不可缺一
未完,待补充...
网友评论