Play animated GIFs in Android(1)

如何在Android里播放GIF动画?这是个有难度的话题,而且也曾被很多的网友所讨论,下面我将结合做的Demo,以及搜索到的各种资源做一个总结。

首先Android动画主要有两种,其一是Animation。另一个就是GIF。

我们可以利用Android为我们提供的alpha,scale,translate,rotate等Animation的一些属性实现渐变透明度、渐变尺寸伸缩动、画面转换位置移动、画面转移旋转等动画效果,

例如我们可以利用以下代码实现一个简单的动画播放效果:

首先我们先创建一个动画XML命名为:chatfrom_voice_playing,你可以选择放到res/anim包下:

 


然后可以在JAVA代码中实现动画的播放:

 

1 ImageView image=(ImageView) this.findViewById(R.id.animation_image);
2 image.setBackgroundResource(R.drawable.chatfrom_voice_playing);
3 AnimationDrawable animation = new AnimationDrawable();
4  animation=(AnimationDrawable)image.getBackground();
5  animation.start();

这样就可以实现三张图片的无限循环播放,参数android:oneshot控制播放一次或则无限循环,参数android:duration控制每张图片的延时时间。

Animation可以满足一些基本的动画需要,而且经小编测试以下的播放代码在ListView中是不会播放的,这其中的原由大致是说与ListView的实现机制有关,有待读者更进一步研究。

Animation实现的动画效果毕竟还是有限的,我们常见的动画大多是通过PhotoShop等专业工具制作的GIF动画图片,以下是我总结的网上所有关于GIF动画播放的代码,仅供参考:

第一种方法:通过Android的Movie。

先贴出实现功能的核心代码:

 1 public class EmojiView extends View {
 2  
 3     private Movie mMovie;
 4  
 5     private long mMoviestart;
 6  
 7     public EmojiView(Context context, AttributeSet attrs) {
 8         super(context, attrs);
 9         java.io.InputStream is = context.getResources().openRawResource(R.drawable.animated_gif);
10  
11                 if (DECODE_STREAM) {
12                     mMovie = Movie.decodeStream(is);
13                } else {
14                    byte[] array = streamToBytes(is);
15                    mMovie = Movie.decodeByteArray(array, 0, array.length);
16               }
17     }  
18  
19        @Override
20         protected void onDraw(Canvas canvas) {
21             canvas.drawColor(0xFFCCCCCC);
22  
23             long now = android.os.SystemClock.uptimeMillis();
24             if (mMovieStart == 0) {   // first time
25                 mMovieStart = now;
26             }
27             if (mMovie != null) {
28                 int dur = mMovie.duration();
29                 if (dur == 0) {
30                     dur = 1000;
31                 }
32                 int relTime = (int)((now - mMovieStart) % dur);
33                 mMovie.setTime(relTime);
34                 mMovie.draw(canvas, getWidth() - mMovie.width(),
35                             getHeight() - mMovie.height());
36                 invalidate();
37             }
38         }
39 }

这个方法的大致原理时候这样的,获取一张GIF图为输入流,通过对输入流转码为一个Movie对象,这个Movie对象相当于就是掌握了这个GIF的所有帧以及每帧的延时时间,
然后通过不停循环的取出GIF的每帧图片绘制在canvas上,从而实现动画效果,那么Movie又是如何取出每帧的图片的呢?
Movie通过设置setTime从而快速定位到某一帧,并通过draw方法将当前帧绘画在canvas上。

注:使用这个方法的读者也许会面临一个困惑的问题,那就是这个在Android的某些版本的某些机型上会出现花屏现象。究其原因是因机型的不同,其包含的libgif.so等也不尽相同,也就是底层gif的播放库用的不同,说了这么多,到底该如何解决GIF播放花屏的问题呢?其实也很简单,只需在制作gif图片的时候,将其属性设置为“处理”即可,如下图所示:

写在最后:正如你所了解的,Movie这个类并不一定能播放所有的GIF动画,对于一些格式的GIF图片,也许第一帧绘画的很好,但后面的就出现花屏,所以如果你选择这个方法,请确保你的GIF图片可以正常播放。

如果你想了解其他的播放GIF的方法,也许是更适合你播放GIF的方法,那么请移步到:动画播放(2)

 

你可以从这个地址下载到Demo: http://code.google.com/p/animated-gifs-in-android/.

 

原文链接:http://www.ithouge.com/play-animated-gif-movie.html

 

posted @ 2012-12-01 17:07  Ithouge  阅读(437)  评论(0编辑  收藏  举报