Android帧动画分析

转载请注明出处:http://blog.csdn.net/binbinqq86/article/details/78127284

说起动画,相信大家都不陌生,每个Android开发者都会接触到。Android中的动画大致可以分为传统动画和属性动画:

  1. 传统动画
    a. 帧动画(FrameAnimation)
    b. 补间动画(TweenAnimatioin)
    1. alpha(淡入淡出)
    2. translate(平移)
    3. scale(缩放)
    4. rotate(旋转)
  2. 属性动画

今天我们主要来分析一下其中的一个分支:帧动画。帧动画一般是多张连续的图片进行连贯的顺序播放,从而在视觉上产生一种动画的效果,最简单的实现方式就是采用系统提供好的方法来实现:

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 =
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值