打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Android APP 内存优化之图片优化(下)


来源: 张明云(@UperOne)

链接:http://www.jianshu.com/p/5bb8c01e2bc7


接上文


通常情况下我会自定义一个ImageView来实现AnimationDrawable的功能,根据图片之间切换的时间间隔来定时设置ImageView的背景图片,这样始终只是一个ImageView实例,更换的只是其背景,占用内存会比AnimationDrawable小很多:


/**

* 图片动态切换器

*

* */

public class AnimImageView {

    private static final int MSG_START = 0xf1;

    private static final int MSG_STOP  = 0xf2;

    private static final int STATE_STOP = 0xf3;

    private static final int STATE_RUNNING = 0xf4;

 

    /* 运行状态*/

    private int mState = STATE_RUNNING;

    private ImageView mImageView;

    /* 图片资源ID列表*/

    private List mResourceIdList = null;

    /* 定时任务*/

    private Timer mTimer = null;

    private AnimTimerTask mTimeTask = null;

    /* 记录播放位置*/

    private int mFrameIndex = 0;

    /* 播放形式*/

    private boolean isLooping = false;

 

    public AnimImageView( ){

        mTimer = new Timer();

    }

 

    /**

     * 设置动画播放资源

     *

     * */

    public void setAnimation( HanziImageView imageview, List resourceIdList ){

        mImageView = imageview;

        mResourceIdList = resourceIdList;

    }

 

    /**

     *  开始播放动画

     *  @param loop 时候循环播放

     *  @param duration 动画播放时间间隔

     * */

    public void start(boolean loop, int duration){

        stop();

        isLooping = loop;

        mFrameIndex = 0;

        mState = STATE_RUNNING;

        mTimeTask = new AnimTimerTask( );

        mTimer.schedule(mTimeTask, 0, duration);

    }

 

    /**

     * 停止动画播放

     *

     * */

    public void stop(){

        if (mTimeTask != null) {

            mFrameIndex = 0;

            mState = STATE_STOP;

            mTimer.purge();

            mTimeTask.cancel();

            mTimeTask = null;

            mImageView.setBackgroundResource(0);

        }

    }

 

    /**

     * 定时器任务

     *

     *

     */

    class AnimTimerTask extends TimerTask {

        @Override

        public void run() {

            if(mFrameIndex <>0 || mState == STATE_STOP){

                return;

            }

 

            if( mFrameIndex <>mResourceIdList.size() ){

                Message msg = AnimHanlder.obtainMessage(MSG_START,0,0,null);

                msg.sendToTarget();

            }else{

                mFrameIndex = 0;

                if(!isLooping){

                    Message msg = AnimHanlder.obtainMessage(MSG_STOP,0,0,null);

                    msg.sendToTarget();

                }

            }

        }

    }

 

    private Handler AnimHanlder = new Handler(){

         public void handleMessage(android.os.Message msg) {

                switch (msg.what) {

                case MSG_START:{

                    if(mFrameIndex >=0 && mFrameIndex <>mResourceIdList.size() && mState == STATE_RUNNING){

                        mImageView.setImageResource(mResourceIdList.get(mFrameIndex));

                        mFrameIndex++;

                    }

                }

                    break;

                case MSG_STOP:{

                    if (mTimeTask != null) {

                        mFrameIndex = 0;

                        mTimer.purge();

                        mTimeTask.cancel();

                        mState = STATE_STOP;

                        mTimeTask = null;

                        mImageView.setImageResource(0);

                    }

                }

                    break;

                default:

                    break;

                }

         }

    };

}


其它优化方式


  • 尽量将Activity中的小图片和背景合并,一张小图片既浪费布局的时间,又平白地增加了内存占用;

  • 不要在Activity的主题中为Activity设置默认的背景图片,这样会导致Activity占用的内存翻倍:

    @drawable/*

  • 对于在需要时才显示的图片或者布局,可以使用ViewStub标签,通过sdk/tools目录下的hierarchyviewer.bat查看布局文件会发现,使用viewstub标签的组件几乎不消耗布局的时间,在代码中当需要显示时再去实例化有助于提高Activity的布局效率和节省Activity消耗的内存。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
ListView具有多种item布局——实现微信对话列 - xyz_lmn的博客 - 51CTO技术博客
Android使用ViewPager实现左右循环滑动及轮播效果
Android进阶
android ListView和GridView拖拽移位具体实现及拓展
android 大图片拖拽并缩放实现原理
Android 实战美女拼图游戏 你能坚持到第几关 | 学步园
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服