转载请注明出处:http://blog.csdn.net/binbinqq86/article/details/78127284
说起动画,相信大家都不陌生,每个Android开发者都会接触到。Android中的动画大致可以分为传统动画和属性动画:
- 传统动画
a. 帧动画(FrameAnimation)
b. 补间动画(TweenAnimatioin)
- alpha(淡入淡出)
- translate(平移)
- scale(缩放)
- rotate(旋转)
- 属性动画
今天我们主要来分析一下其中的一个分支:帧动画。帧动画一般是多张连续的图片进行连贯的顺序播放,从而在视觉上产生一种动画的效果,最简单的实现方式就是采用系统提供好的方法来实现:
iv.setBackgroundResource(R.drawable.values);
AnimationDrawable anim = (AnimationDrawable) iv.getBackground();
anim.start();
values为动画资源文件:(这里只放了前10张)
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@mipmap/yacht1" android:duration="150" />
<item android:drawable="@mipmap/yacht2" android:duration="150" />
<item android:drawable="@mipmap/yacht3" android:duration="150" />
<item android:drawable="@mipmap/yacht4" android:duration="150" />
<item android:drawable="@mipmap/yacht5" android:duration="150" />
<item android:drawable="@mipmap/yacht6" android:duration="150" />
<item android:drawable="@mipmap/yacht7" android:duration="150" />
<item android:drawable="@mipmap/yacht8" android:duration="150" />
<item android:drawable="@mipmap/yacht9" android:duration="150" />
<item android:drawable="@mipmap/yacht10" android:duration="150" />
</animation-list>
里面的oneshot属性代表是否是重复播放。这里我们采用的图片是1080*1920分辨率的,显示在1080p的手机上并铺满屏幕,来看下显示效果:
来看一下内存的使用情况:
可以看到,内存直接暴涨到来94M,这是为什么呢,假如我们把所有的几十张图片全部放出来呢,运行一下,结果程序直接崩掉了,由此我们可以猜想系统是一次性加载了所有的资源到内存中去的,这样的话,这种方式就只能做一些简单的小动画了。为了验证我们的猜想,下面继续一探究竟。
首先来分析下图片在内存中的占用情况:
ARGB_8888:A->8bit->一个字节,R->8bit->一个字节,
G->8bit->一个字节,B->8bit->一个字节,即8888,
一个像素总共占四个字节,8+8+8+8=32bit=4byte
ARGB_4444:A->4bit->半个字节,R->4bit->半个字节,
G->4bit->半个字节,B->4bit->半个字节,即4444,
一个像素总共占两个字节,4+4+4+4=16bit=2byte
RGB_565:R->5bit->半个字节,G->6bit->半个字节,
B->5bit->半个字节,即565,一个像素总共占两个字节,
5+6+5=16bit=2byte
ALPHA_8:A->8bit->一个字节,即8,一个像素总共占一个字节,
8=8bit=1byte
图片在内存中一般会有这几种存在方式,默认为ARGB_8888,这样我们一张1080*1920图片放在xxdpi下展示在1080*1920手机上铺满屏幕所占内存:
1080*1920*4/1024/1024=7.91M
所以可以得出,系统原生动画加载上述10张图内存为94M的缘故:系统把所有图片一次性加载到内存中了。
注意:如果放在xdpi下,则图片呈现在1080*1920手机上会被放
大1.5倍,这时所占内存也增加了1.5倍,
开发的时候需要注意哦!!!
为了进一步验证我们的猜想,下面去源码里面扒一扒!首先来看下getBackground这个方法,它返回一个Drawable,我们去看Drawable里面到底是怎么把资源文件加载为动画的:
/**
* Create a drawable from an XML document. For more information on how to
* create resources in XML, see
* <a href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable Resources</a>.
*/
public static Drawable createFromXml(Resources r, XmlPullParser parser)
throws XmlPullParserException, IOException {
return createFromXml(r, parser, null);
}
继续看createFromXml这个方法:
/**
* Create a drawable from an XML document using an optional {
@link Theme}.
* For more information on how to create resources in XML, see
* <a href="{
@docRoot}guide/topics/resources/drawable-resource.html">Drawable Resources</a>.
*/
public static Drawable createFromXml(Resources r, XmlPullParser parser, Theme theme)
throws XmlPullParserException, IOException {
AttributeSet attrs =