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