android 播放gif动态图片以及用animation来播放多张png

android不推荐使用gif图片,一般都是png的,对于gif的图片解析比较消耗资源,但是对于一些动态gif图片的播放,如果比较小的话还是可以的,要是大的话,建议还是把gif图片转换成一帧一帧的png图片,然后通过animation播放。

对于小的gif动态图片,可以通过Movie来播放,代码如下:

public class TestAvtivity extends Actitvity

{

 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);

  setContentView(new CustomGifView(mContext));

   

 

    class CustomGifView extends View {
  
        public CustomGifView(Context context) {
            super(context);
            if(g == 1)
      {
             mMovie = Movie.decodeStream(getResources().openRawResource(
                        R.drawable.praise1));
      }else if(g == 2)
      {
       mMovie = Movie.decodeStream(getResources().openRawResource(
                        R.drawable.praise2));
      }else
      {
       mMovie = Movie.decodeStream(getResources().openRawResource(
                        R.drawable.praise3));
      }
 
        }
       
        public void onDraw(Canvas canvas) {
 
            long now = android.os.SystemClock.uptimeMillis();
           
            if (mMovieStart == 0) { // first time
                mMovieStart = now;
            }
            if (mMovie != null) {
               
                int dur = mMovie.duration();
                if (dur == 0) {
                    dur = 1000;
                }
                int relTime = (int) ((now - mMovieStart) % dur);
                mMovie.setTime(relTime);
                mMovie.draw(canvas, 0, 0);
                invalidate();
            }
        }
 
    }

}

 

方法说明:

decodeByteArray(byte[] data, int offset, int length)
decodeFile(String pathName)
decodeStream(InputStream is)
三种不同的静态方法来获取Movie对象。三种方式的原理其实都一样,都是读入字节流来解码创建Movie对象。decodeByteArray是从一个已经存在的字节数组中创建,decodeFile是从一个文件读入字节流来创建。

draw(Canvas canvas, float x, float y)
draw(Canvas canvas, float x, float y, Paint paint)
绘制动画帧。
它们其实还是调用Canvas的drawBitmap来绘制帧的。

duration()
动画持续的时间,也就是完成一次动画播放的时间。

isOpaque()
是不是不透明

setTime(int relativeMilliseconds)
设置相对本次播放第一帧时间,根据这个时间来决定显示第几帧。

例如:
int relTime=(int)((now – moviestart)%movie.duration());
now:系统当前时刻
moviestart:动画开始的时间
movie.duration:动画持续的时间,也就是完成一次动画的时间
注意这是取余操作,这才能算出当前这次重复播放的第一帧的时间

 

我一开始播放gif的时候,发现出现了很多雪花,画面很不清楚,后来使用apiDemo里面的gif图片发现没有问题,所以断定是gif格式的问题,从网上查发现,把gif图片用Adobe ImageReady打开,然后在每一帧上右击选择恢复为背景,之后就可以了。

 

 

如果gif图片过大,建议还是把图片拆分成一张张的png图片然后通过Animation播放,代码如下:

 

在res目录下新建anim动画文件夹里面创建xml文件game_anim_lalian,写下如下代码

<?xml version="1.0" encoding="UTF-8"?>
< animation-list android:oneshot="false"
xmlns:android="http://schemas.android.com/apk/res/android">
< item android:duration="150" android:drawable="@drawable/xiu0"
/>
< item android:duration="150" android:drawable="@drawable/xiu1"
/>
< item android:duration="150" android:drawable="@drawable/xiu2"
/>
< item android:duration="150" android:drawable="@drawable/xiu3"
/>
< /animation-list>

 

java代码:

private AnimationDrawable animDown = new AnimationDrawable();

private ImageView imgGameWord;

 

imgGameWord = (ImageView) this.findViewById(R.id.imgGameWord);

imgGameWord.setBackgroundResource(R.drawable.game_anim_lalian);
  animDown = (AnimationDrawable) imgGameWord.getBackground();

 

private void startAnim_Lalian()
 {
  new Thread()
  {
   @Override
   public void run()
   {
    super.run();
    myHandler.post(new Runnable() {
     @Override
     public void run() {
      if(animDown.isRunning())
      {
       animDown.stop();
      }
      animDown.start();
      animDown.setOneShot(true);//设置是否只播放一遍


     }
    });
   }
  }.start();
 }
 
 private void stopAnim_Lalian()
 {
  new Thread()
  {
   @Override
   public void run()
   {
    super.run();
    myHandler.post(new Runnable() {
     @Override
     public void run() {
      animDown.stop();
      imgGameWord.clearAnimation();
      imgGameWord.destroyDrawingCache();
     }
    });
   }
  }.start();
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值