Android如何播放GIF动画
16lz
2021-01-24
Android支持GIF动画,但是如果利用ImageView标签直接写在布局文件中:
Xml代码
程序只能加载GIF动画的第一帧。效果如下:
如果想要正常播放GIF动画,需要借助Movie实现。写了一个简单示例,程序目录结构如下:
animation.gif是需要播放的GIF动画。
MainActivity实现了加载GIF动画的功能。
Java代码
内部类CustomGifView 利用Movie播放GIF动画。解释一下:
Java代码
将GIF动画以文件流的形式转换成Movie。
Java代码
invalidate();作用是刷新当前View,这样onDraw方法重复执行,Movie就能画出GIF动画的每一帧。到此,GIF动画就能正常播放了。
Xml代码
- <ImageViewandroid:id="@+id/gifpicture"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:src="@drawable/animation"/>
程序只能加载GIF动画的第一帧。效果如下:
如果想要正常播放GIF动画,需要借助Movie实现。写了一个简单示例,程序目录结构如下:
animation.gif是需要播放的GIF动画。
MainActivity实现了加载GIF动画的功能。
Java代码
- publicclassMainActivityextendsActivity{
- privateMoviemMovie;
- privatelongmMovieStart;
- /**Calledwhentheactivityisfirstcreated.*/
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(newCustomGifView(this));
- }
- classCustomGifViewextendsView{
- publicCustomGifView(Contextcontext){
- super(context);
- mMovie=Movie.decodeStream(getResources().openRawResource(
- R.drawable.animation));
- }
- publicvoidonDraw(Canvascanvas){
- longnow=android.os.SystemClock.uptimeMillis();
- if(mMovieStart==0){//firsttime
- mMovieStart=now;
- }
- if(mMovie!=null){
- intdur=mMovie.duration();
- if(dur==0){
- dur=1000;
- }
- intrelTime=(int)((now–mMovieStart)%dur);
- mMovie.setTime(relTime);
- mMovie.draw(canvas,0,0);
- invalidate();
- }
- }
- }
- }
内部类CustomGifView 利用Movie播放GIF动画。解释一下:
Java代码
- mMovie=Movie.decodeStream(getResources().openRawResource(R.drawable.animation));
将GIF动画以文件流的形式转换成Movie。
Java代码
- publicvoidonDraw(Canvascanvas){
- longnow=android.os.SystemClock.uptimeMillis();
- if(mMovieStart==0){//firsttime
- mMovieStart=now;
- }
- if(mMovie!=null){
- intdur=mMovie.duration();
- if(dur==0){
- dur=1000;
- }
- intrelTime=(int)((now–mMovieStart)%dur);
- mMovie.setTime(relTime);
- mMovie.draw(canvas,0,0);
- invalidate();
- }
- }
invalidate();作用是刷新当前View,这样onDraw方法重复执行,Movie就能画出GIF动画的每一帧。到此,GIF动画就能正常播放了。
更多相关文章
- Android(安卓)进程间通信的几种实现方式
- Android_UI_实现TabHost的两种方法
- Android的AIDL服务
- Android自定义动画专题一
- Android(安卓)RotateAnimation详解
- android客户端xmpp & smack & openfire简单开发实例
- 在eclipse里配置Android(安卓)ndk环境 适用于windows mac 和linu
- Android(安卓)原生控件ViewFlipper实现淘宝头条垂直滚动广告条
- Android对文件的操作(简单的文件读取与写入)