Androidでgif画像を動的に表示

4632 ワード

Androidが持っているコントロールにはgif画像が表示されません
ネット上の解決方法は大体3種類あります
第一に、gifピクチャをNフレームに分割し(アメリカ/ソフトウェアで完了)、その後、逐次再生する.
第二に、javaコードを利用して画像をNフレームに分割する.
第三:androidには、gifアニメーションを再生するために使用できるMovieクラスがあります(android.graphicsパッケージの下にあります)
前の2つの考え方は同じで、2つ目のネット上にはjarパッケージがダウンロードできます(リソースにアップロードされています).
1つ目はフレーム数の多い画像に対して煩雑すぎて、使用を提唱しない.
まず2つ目の方法を説明します.
GifAction.JAvaオブザーバークラスは、GIFがGifFrameをロードに成功したかどうかを監視する.JAvaの3人のメンバー:現在の画像、遅延、次のFrameのリンク.GifDecoder.JAva復号スレッドクラスGifView.JAvaマスタークラスは、GifView構築方法、ピクチャソースの設定、遅延、描画など、一般的な方法を含む.
 
public interface GifAction {

	/**
	 * gif     
	 * @param parseStatus       ,    true
	 * @param frameIndex         ,        ,   -1
	 */
	public void parseOk(boolean parseStatus,int frameIndex);
}

 
//    gif    
public class GifDecoder extends Thread

 
//gif  
public class GifFrame
{
	/**
	 *     
	 * 
	 * @param im
	 *              
	 * @param del
	 *              
	 */
	public GifFrame(Bitmap im, int del)
	{
		image = im;
		delay = del;
	}

	/**    */
	public Bitmap image;
	/**    */
	public int delay;
	/**     */
	public GifFrame nextFrame = null;
}

 
/**
 * GifView
* gif , android view( imageview) 。
* gif , OOM 。 * * @author liao * */ public class GifView extends View implements GifAction

 
次のように適用されます.
1-GifView.JArはあなたのプロジェクトに参加します.2-xmlでGifViewの基本プロパティを設定します.GifViewはViewクラスから継承され、Button、ImageViewと同様にUIコントロールです.android:layout_height="wrap_content"android:layout_width="wrap_content"android:paddingTop="4 px"android:paddingLeft="14 px"android:enabled="false"/>3-コードに共通属性を設定する//xmlからGifViewのハンドルgf 1=(GifView)findView(R.id.gif 1);//Gifピクチャソースgf 1を設定.setGifImage(R.drawable.gif1);//リスナーgf 1を追加する.setOnClickListener(this);//表示の大きさを設定、gf 1を延伸または圧縮する.setShowDimension(300, 300);//ロード方式を設定:ロード後の表示、ロードエッジの表示、第1フレームのみの表示、gf 1の表示.setGifImageType(GifImageType.COVER);
 
次に、3つ目の方法を分析します.
、gifピクチャを表示するには、カスタム属性を含むMovieクラスとカスタムコントロールを使用する必要があります.
まず、コントロールのプロパティを定義します.
res/valuesにxmlファイルを作成し、命の名前attrsに慣れます.xml(他の名前に名前を付けることができます)
ここでxmlに追加されたプロパティは次のとおりです.

            




 
ここではsrcファイルを設定するプロパティを1つだけ追加しました.
プロパティが設定されています.では、このsrcプロパティをjavaコードにどのように対応させるか、これは構造関数に処理する必要があります.
public GifView(Context context, AttributeSet attrs){
  super(context, attrs);
  TypedArray ta = context.obtainStyledAttributes(attrs,  
                R.styleable.GifView);  //     attrs.xml     GifView
  int taCount = ta.length();   //       
  
  for (int i=0;i

次はsetSrc関数です.
public void setSrc(int id){
  gifMovie = Movie.decodeStream(getResources().openRawResource(id)); //gifMovie Movie  
 }


次はviewのonDraw関数、これも絵画アニメーションの鍵です
public void onDraw(Canvas canvas){
   long now = android.os.SystemClock.uptimeMillis(); //      
         if (lStartTime == 0) {   // first time
          lStartTime = now;
         }
         if (gifMovie != null) {
             int dur = gifMovie.duration();  //  gif       
             if (dur == 0) {
                 dur = 1000;
             }
             int relTime = (int)((now - lStartTime) % dur);
             gifMovie.setTime(relTime);  //       
             gifMovie.draw(canvas, getWidth() - gifMovie.width(),  //  (   )
                         getHeight() - gifMovie.height());
             invalidate();
         }

}


 
次はmain.xmlファイルにカスタムGifViewコントロールを追加







ここでxmlns:gif="http://schemas.android.com/apk/res/com.gif.demo「すなわちgifは自分で定義したnamespaceであり、com.gif.demoは自分のパケット名、すなわちactivityに対応するパケット名に対応する
最後にactivityでsetContentView(R.layout.main)でOK