android中播放gif动画之二
2014-03-03 23:29
489 查看
在上一篇,是使用代码通过构造方法传入要播放的gif动画的id进行获取的。本文进一步改造,让GifView和ImageView一样可以在布局文件中设置src属性,并在GifView中我们使用反射动态获取src的图片资源ID,然后对它进行播放。这样使用起来就灵活多了。代码如下:
GifView:
attrs.xml:
main.xml:
禁用硬件加速:
GifView:
package com.home.gifview; import java.io.InputStream; import java.lang.reflect.Field; import android.content.Context; import android.content.res.TypedArray; 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.util.TypedValue; import android.widget.ImageView; public class GifView extends ImageView { private Movie movie; private long movieStart; private int imageWidth; private int imageHeight; public GifView(Context context) { super(context); } public GifView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public GifView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.GifView); int resourceId = getResourceId(a, context, attrs); if (resourceId != 0) { InputStream is = getResources().openRawResource(resourceId); movie = Movie.decodeStream(is); if (movie != null) { Bitmap bitmap = BitmapFactory.decodeStream(is); imageWidth = bitmap.getWidth(); imageHeight = bitmap.getHeight(); bitmap.recycle(); } } } @Override protected void onDraw(Canvas canvas) { if (movie == null) { // 普通图片则直接调用父类的onDraw()方法 super.onDraw(canvas); } else { playGif(canvas); invalidate(); } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (movie != null) { // 如果是gif图片则定制GifView的大小 setMeasuredDimension(imageWidth, imageHeight); } } /** * 播放gif动画 * * @param canvas * @return */ private boolean playGif(Canvas canvas) { long now = SystemClock.uptimeMillis(); if (movieStart == 0) { movieStart = now; } int duration = movie.duration(); if (duration == 0) { duration = 1000; } int relTime = (int) ((now - movieStart) % duration); movie.setTime(relTime); movie.draw(canvas, 0, 0); if ((now - movieStart) >= duration) { movieStart = 0; return true; } return false; } /** * 使用反射,获取到src指定图片资源所对应的id。 * * @param a * @param context * @param attrs * @return */ private int getResourceId(TypedArray a, Context context, AttributeSet attrs) { try { Field field = TypedArray.class.getDeclaredField("mValue"); field.setAccessible(true); TypedValue typedValueObject = (TypedValue) field.get(a); return typedValueObject.resourceId; } catch (Exception e) { e.printStackTrace(); } finally { if (a != null) { a.recycle(); } } return 0; } }
attrs.xml:
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="GifView"></declare-styleable> </resources>
main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <com.home.gifview.GifView android:id="@+id/main_gifView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:src="@drawable/loading" /> </RelativeLayout>
禁用硬件加速:
android:hardwareAccelerated="false"
相关文章推荐
- Android播放gif动画,增加屏幕掉金币效果
- Android上播放Gif图片的方法之二
- android播放gif图片动画
- android 播放 gif 动画
- Android扩展ImageView播放gif动画
- android 通过帧动画方式播放Gif动画
- android 拓展ImageView播放GIF动画
- Android高级控件(二)——SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现
- Android播放GIF动画
- android中播放gif动画之一
- Android中播放GIF图片动画
- Android实现播放GIF动画的强大ImageView
- Android采用Movie播放GIF动画
- Android实现播放GIF动画的强大ImageView
- Android 播放Gif 动画
- Android 播放Gif 动画
- Android 播放Gif 动画
- android gif 动画播放
- Android 播放GIF动画
- Android Graphics 学习(1)----播放gif动画简单的实现