Android帧动画实现,防OOM,比原生动画集节约超过十倍的资源

2015年项目接到一个需求,实现一个向导动画,这个动画一共六十张图片,当时使用的是全志A33的开发(512的内存),通过使用Android的动画集实现,效果特别卡顿,然后想到这种方式来实现,效果很流畅.然后写成开一个开源项目供大家参考

对比以下两种方式实现帧动画,使用相同的80张280x280的png图片执行动画,资源占用情况对比:

Android帧动画实现,防OOM,比原生动画集节约超过十倍的资源_第1张图片

Android动画集实现: 内存占用56M左右

FrameAnimation实现: 内存占用4M左右

两者CUP占用都比较低,可忽略

代码下载:
https://github.com/ansen360/FrameAnimation

Sample效果:

Android帧动画实现,防OOM,比原生动画集节约超过十倍的资源_第2张图片

一、Android动画集实现帧动画
  • 1 在drawable目录下创建动画集animalist.xml



    
    
    
     
    
    


  • 2 在布局文件ImageView中使用该drawable



    



  • 3 在代码中调用,启动动画
    ImageView image = (ImageView) findViewById(R.id.image);

    AnimationDrawable animationDrawable = (AnimationDrawable) image.getDrawable();
        animationDrawable.start();

动画启动系统资源占用情况如下:

Android帧动画实现,防OOM,比原生动画集节约超过十倍的资源_第3张图片
手动触发GC,内存占用几乎没改变

二、FrameAnimation实现帧动画
  • 1 定义需要播放动画的资源文件;在arrays文件中定义资源,或者在代码中定义



    
    

        @mipmap/c_1
        @mipmap/c_2
        
        @mipmap/circle_19
        @mipmap/circle_20
    


获取定义之后的资源数组(代码中可直接定义资源文件的数组,便可忽略上一步):

    private int[] getRes() {
        TypedArray typedArray = getResources().obtainTypedArray(R.array.c);
        int len = typedArray.length();
        int[] resId = new int[len];
        for (int i = 0; i < len; i++) {
            resId[i] = typedArray.getResourceId(i, -1);
        }
        typedArray.recycle();
        return resId;
    }
  • 2 在代码中调用,启动动画
    ImageView image = (ImageView) findViewById(R.id.image);

    FrameAnimation frameAnimation = new FrameAnimation(image, getRes(), 50, true);
    frameAnimation.setAnimationListener(new FrameAnimation.AnimationListener() {
        @Override
        public void onAnimationStart() {
            Log.d(TAG, "start");
        }

        @Override
        public void onAnimationEnd() {
            Log.d(TAG, "end");
        }

        @Override
        public void onAnimationRepeat() {
            Log.d(TAG, "repeat");
        }
    });

动画启动系统资源占用情况如下:

Android帧动画实现,防OOM,比原生动画集节约超过十倍的资源_第4张图片
手动触发GC,内存占用有明显变化

博客地址

你可能感兴趣的:(Android,#,性能优化)