Android 中使用ImageView实现播放Gif图片功能
2016-08-12 18:10
1431 查看
概述
最近在项目中遇到需要展示Gif图片的功能,我们知道原生ImageView是不支持播放Gif的,但是Android为我们提供了一个类可以实现该功能:android.graphics.Movie。该类的实现思路
1.将Gig图片资源生成流的对象,然后Movie将流解码成一个Movie的对象。InputStream is = getResources().openRawResource(resourceId); movie = Movie.decodeStream(is);
2.获取Movie的动画时长
int duration = movie.duration();
3.根据时间,绘制出对应每一帧的图片
int relTime = (int) ((now - mMovieStart) % duration); movie.setTime(relTime); movie.draw(canvas, 0, 0);
具体代码实现
package com.example.powerimageviewtest; import java.io.InputStream; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Movie; import android.os.SystemClock; import android.util.AttributeSet; import android.widget.ImageView; /** * 继承了ImageView原生的所有功能,还加入了播放GIF动画的功能。 * */ public class GifImageView extends ImageView { /** * 播放GIF动画的关键类 */ private Movie mMovie; /** * 记录动画开始的时间 */ private long mMovieStart; /** * GIF图片的宽度 */ private int mImageWidth; /** * GIF图片的高度 */ private int mImageHeight; /** * PowerImageView构造函数。 * * @param context */ public GifImageView(Context context) { super(context); } /** * PowerImageView构造函数。 * * @param context */ public GifImageView(Context context, AttributeSet attrs) { this(context, attrs, 0); } /** * PowerImageView构造函数,在这里完成所有必要的初始化操作。 * * @param context */ public GifImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); int resourceId = getResourceId(context, attrs); if (resourceId != 0) { // 当资源id不等于0时,就去获取该资源的流 InputStream is = getResources().openRawResource(resourceId); // 使用Movie类对流进行解码 mMovie = Movie.decodeStream(is); if (mMovie != null) { // 如果返回值不等于null,就说明这是一个GIF图片 Bitmap bitmap = BitmapFactory.decodeStream(is); if(bitmap != null){ mImageWidth = bitmap.getWidth(); mImageHeight = bitmap.getHeight(); bitmap.recycle(); } } } } @Override protected void onDraw(Canvas canvas) { if (mMovie == null) { // mMovie等于null,说明是张普通的图片,则直接调用父类的onDraw()方法 super.onDraw(canvas); } else { // mMovie不等于null,说明是张GIF图片 // 调用playMovie()方法播放GIF动画 if(!playMovie(canvas)){ invalidate(); } } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (mMovie != null) { // 如果是GIF图片则重写设定PowerImageView的大小 setMeasuredDimension(mImageWidth, mImageHeight); } } /** * 开始播放GIF动画,播放完成返回true,未完成返回false。 * * @param canvas * @return 播放完成返回true,未完成返回false。 */ private boolean playMovie(Canvas canvas) { long now = SystemClock.uptimeMillis(); if (mMovieStart == 0) { mMovieStart = now; } int duration = mMovie.duration(); if (duration == 0) { duration = 1000; } int relTime = (int) ((now - mMovieStart) % duration); mMovie.setTime(relTime); mMovie.draw(canvas, 0, 0); if ((now - mMovieStart) >= duration) { //播放完成,显示最后一帧 mMovie.setTime(duration); mMovie.draw(canvas, 0, 0); return true; } return false; } /** * 获取到src指定图片资源所对应的id。 * * @param context * @param attrs * @return 返回布局文件中指定图片资源所对应的id,没有指定任何图片资源就返回0。 */ private int getResourceId(Context context, AttributeSet attrs) { for (int i = 0; i < attrs.getAttributeCount(); i++) { if (attrs.getAttributeName(i).equals("src")) { return attrs.getAttributeResourceValue(i, 0); } } return 0; } }
xml中调用方式
<com.example.powerimageviewtest.GifImageView android:id="@+id/image_view" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="centerCrop" android:src="@drawable/start3" />
注意:
有时会遇到无法正常播放gif情况,这时需要在当前Acitvity中关闭硬件加速 android:hardwareAccelerated=”false”
相关文章推荐
- android平台TextView使用ImageSpan展示GIF图片
- Android图片滚动,加入自动播放功能,使用自定义属性实现,霸气十足!
- Android 使用ViewPager结合PhotoView开源组件实现网络图片在线浏览功能
- 【Android 开发】:UI控件之 ImageView 实现图片旋转和缩放功能
- android困惑之UI---imageView实现对图片的选取,和裁剪功能。。。。
- 实现android gif图片动画播放功能
- android自定义View实现裁剪图片功能,不使用系统的
- Android高级控件(二)——SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现
- Android 图片滚动,加入自动播放功能,使用自定义属性实现,霸气十足!
- Android图片滚动,加入自动播放功能,使用自定义属性实现,霸气十足!
- Android 利用TimerTask实现ImageView图片播放效果
- Android - 小功能 使用ImageView加载本地SdCard图片和加载网络图片
- Android实现播放GIF动画的强大ImageView
- ImageView的使用,实现本地图片的适屏显示和裁剪功能。
- android 图片浏览功能 图片放大缩小 使用 photoview 双击或双指缩放的ImageView
- Android图片滚动,加入自动播放功能,使用自定义属性实现,霸气十足!
- Android图片滚动,加入自动播放功能,使用自定义属性实现,霸气十足!
- android中使用imageview显示Gif图片
- Android 重写ImageView实现图片手势功能
- Android 使用ViewPager结合PhotoView开源组件实现网络图片在线浏览功能