Play gif animation in android

In the previous article, it was obtained by using the code to pass in the id of the gif animation to be played through the construction method. This article is further modified, so that GifView and ImageView can set the src attribute in the layout file, and in GifView we use reflection to dynamically obtain the src image resource ID, and then play it. This makes it more flexible to use. code show as below:

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>

Disable hardware acceleration:

android:hardwareAccelerated="false"





 

Reprinted from: https://my.oschina.net/secyaher/blog/274414

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324074057&siteId=291194637