Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 633|回复: 0

android 帧动画的实现及图片过多时OOM解决方案(一)

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-4-17 14:08:35 | 显示全部楼层 |阅读模式
    一,animation_list.xml中静态配置帧动画的顺序,如下:
    <?xml version="1.0" encoding="utf-8"?>
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true" >
     
        <item android:drawable="@drawable/animation_1" android:duration="1000"/>
        <item android:drawable="@drawable/animation_2" android:duration="100"/>
        <item android:drawable="@drawable/animation_3" android:duration="100"/>
        <item android:drawable="@drawable/animation_4" android:duration="100"/>
        <item android:drawable="@drawable/animation_5" android:duration="100"/>
    </animation-list>
    注意:
    1,android:duration="100" 指的是相应帧持续的时间。
    2,android:oneshot 的配置 如果为true,表示动画只播放一次停止在最后一帧上,如果设置为false表示动画循环播放。
    二、方法中调用,如下:
    mImageView.setImageResource(R.drawable.animation_list); animationDrawable = (AnimationDrawable) mImageView.getDrawable(); animationDrawable.start();

    当然,也可以在方法中动态设置动画的播放,调用如下方法:

    void setOneShot(boolean oneShot):设置AnimationDrawable是否执行一次,true执行一次,false循环播放
    这时也可以中途控制动画的播放与停止,如下所示:
    mImageView.setImageResource(R.drawable.animation_list); animationDrawable = (AnimationDrawable) mImageView.getDrawable(); if(animationDrawable.isRunning()){    //当前AnimationDrawable是否正在播放
                  animationDrawable.stop();    //停止播放逐帧动画。
    } animationDrawable.start(); //开始播放逐帧动画。

    三、OOM解决方案(一):

    使用以上方法基本可以解决20张图片以内的帧动画了,但是图片一多,便会报OOM错误,
    以下是我的一个解决方案,不是最好的,我也觉得有很多问题,但确实解决了这个问题,
    姑且称为方案一,相信我还会想到更好的解决方案,到时候再与大家分享
    1,首先在初始化时,直接初始化两个数组,一个保存每一帧照片,另一个保存每一帧图片的持续时间
     images = new int [42];     images[0] = R.drawable.animation_0;     //动画开始时的动画
             images[1] = R.drawable.animation_1; images[2] = R.drawable.animation_2; images[3] = R.drawable.animation_3; ...... images[40] = R.drawable.animation_40; images[41] = R.drawable.animation_41;   //动画结束时的画面
     durations = new int[40] ; durations[0] = 200;   //事件触发后多长时间开始动画
             durations[1] = 100; durations[2] = 200; ...... durations[40] = 300;
    2,新建myAnimation类:
       public class myAnimation{ private ImageView mImageView;   //播方动画的相应布局
            private int[] mImageRes; private int[] durations; public myAnimation(ImageView pImageView, int[] pImageRes, int[] durations) { this.mImageView = pImageView; this.durations = durations; this.mImageRes= pImageRes; mImageView.setImageResource(mImageRes[1]); play(1); } private void play(final int pImageNo) { mImageView.postDelayed(new Runnable() {     //采用延迟启动子线程的方式
                    public void run() { mImageView.setImageResource(mImageRes[pImageNo]); if (pImageNo == mImageRes.length-1) return; else play(pImageNo + 1); } }, durations[pImageNo-1]); } }
    3,在监听事件中新建一个myAnimation类的对象即可:
      new myAnimation(ImageView, images,durations);

     

     
     
    --------------------------------------------------------------------------------------------
    刚开始学习,写博客只是希望能记录自己的成长轨迹,欢迎大家指点。
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-16 01:38 , Processed in 0.076137 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表