web-dev-qa-db-ja.com

Androidで.gif画像をアニメーション化する方法は?

これがxmlのコードです:

<ImageView
    Android:id="@+id/imageView1"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:src="@drawable/minepic" />

ここでminepicはgifアニメーション画像ですが、アプリケーションを実行すると、静的画像が表示されます。

Androidアプリケーションで.gif画像をアニメーション化する方法についての解決策はありますか?

17
Danny

ここで正確かつ完全な答えを出すには、段階的に行う必要があります。

  1. アニメーションのフレームとして機能する別の_.png_画像が必要です。それらを_res/drawable_フォルダーに保存します。

  2. 次の内容の_anim.xml_フォルダに_res/drawable_ファイルを作成します。

    _<?xml version="1.0" encoding="utf-8"?>
    <animation-list xmlns:Android="http://schemas.Android.com/apk/res/Android" 
        Android:oneshot="false">
    
        <item Android:drawable="@drawable/image_3" Android:duration="250" />
        <item Android:drawable="@drawable/image_2" Android:duration="250" />
        <item Android:drawable="@drawable/image_1" Android:duration="250" />
        <item Android:drawable="@drawable/image" Android:duration="250" />
    
    </animation-list>
    _
  3. アニメーションを表示するレイアウトxmlファイル内:

    _//...
    <ImageView
         Android:id="@+id/iv_animation"
         Android:layout_width="wrap_content"
         Android:layout_height="wrap_content"
         Android:layout_centerHorizontal="true"
         Android:contentDescription="Animation" />
    //...
    _
  4. Javaファイルで、レイアウトxmlファイルをロードしてsetContentViewを呼び出します:

    _//...
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        final ImageView animImageView = (ImageView) findViewById(R.id.iv_animation);
        animImageView.setBackgroundResource(R.drawable.anim);
        animImageView.post(new Runnable() {
            @Override
            public void run() {
                AnimationDrawable frameAnimation =
                    (AnimationDrawable) animImageView.getBackground();
                frameAnimation.start();
            }
        });
        // ... other code ... 
    }
    // ...
    _

アニメーションを停止するには、AnimationDrawable.stop()を呼び出します。利用可能なメソッドの詳細については、 AnimationDrawable のドキュメントを参照してください。それが誰かを助けることを願っています。

37
Shobhit Puri

MovieまたはWebViewクラスを使用することはお勧めしませんが、代わりにImageViewを使用して、ソースドローアブルをanimation-listに設定します。例を見てください(mydrawable.xml):

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:oneshot="false">
<item Android:drawable="@drawable/image_1" Android:duration="100" />
<item Android:drawable="@drawable/image_2" Android:duration="100" />
<item Android:drawable="@drawable/image_3" Android:duration="100" />
</animation-list> 

// in your layout : <ImageView
   Android:layout_width="wrap_content"
   Android:layout_height="wrap_content"
   Android:src="@drawable/my_drawable" />

明らかに、このソリューションを使用する前に、.gifを別の画像にスライスする必要があります。

14
Piotr

私が理解している限り、あなたのGIF画像は動かないので、これはネイティブのAndroid GIFを静止画像のように扱う場合の動作です。私にとっては、最善の解決策(ホイールを再発明しないこと!)オープンソースライブラリ gitDrawable でした。READMEを確認してください。すべてが非常に単純です。gradleに依存関係を追加して(XMLまたはコードで)使用してください。Javaでの使用例:

GifDrawable gifFromResource = new GifDrawable( getResources(), R.drawable.anim );
2
torina

さて、私はこの簡単なコードを使用してAndroid画像をアニメーション化することができました:

canvas.drawColor(Color.WHITE);
super.onDraw(canvas);


long now=Android.os.SystemClock.uptimeMillis();
System.out.println("now="+now);
if (moviestart == 0) { // first time
moviestart = now;

}

System.out.println("\tmoviestart="+moviestart);
int relTime = (int)((now - moviestart) % movie.duration()) ;
 System.out.println("time="+relTime+"\treltime="+movie.duration());
movie.setTime(relTime);
movie.draw(canvas,this.getWidth()/2-20,this.getHeight()/2-40);
this.invalidate();
 }


それはmovieviewを使用して簡単に実装されました

または、私はあなたに tutorial を与えることができます

0
dondondon
And i think this is the one way of solution by writing the anim-space.xml 
In which the slices of the image are added to the items one by one and setting that xml to the imageview of our layout xml.

http://developer.Android.com/reference/Android/graphics/drawable/AnimationDrawable.html

この開発者リンクでは、明確に定義されています。

0
Danny

ドローアブルの描画中にビューが変更された可能性があるため、スレッド(つまりView.post(new Runnable))を使用することはお勧めしません(1つのケースは、異なる背景画像を含むアイテムでListViewのアニメーション画像を使用しています)スレッドの実行時にImageViewの背景にアニメーションリソースではない背景がある場合、ClassCastExceptionが発生する可能性があります。

ImageView loadingImg = (ImageView)v.findViewById(R.id.image);
loadingImg.setBackgroundResource(R.drawable.progressdialog);
loadingImg.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
  @Override
  public void onViewAttachedToWindow(View v) {
    AnimationDrawable loadingAnimation = (AnimationDrawable) v.getBackground();
    loadingAnimation.start();
  }

  @Override
  public void onViewDetachedFromWindow(View v) {
  }
});

例を示します ここ

0