Android のアニメーション GIF のView
とDrawable
。
フレームのレンダリングには、JNI 経由でバンドルされた GIFLib が使用されます。この方法は、 WebView
クラスやMovie
クラスよりも効率的です。
次の依存関係をプロジェクトのbuild.gradle
ファイルに挿入します。
依存関係 { 実装 'pl.droidsonroids.gif:android-gif-drawable:1.2.29'}
Maven 中央リポジトリを定義する必要があることに注意してください。トップレベルのbuild.gradle
では次のようになります。
ビルドスクリプト { リポジトリ { mavenCentral() } } すべてのプロジェクト { リポジトリ { mavenCentral() } }
現在の開発ビルド ( dev
ブランチからのビルド) は、OSS スナップショット リポジトリに公開されます。これらを使用するには、 repositories
ブロックでリポジトリ URL を指定します。
リポジトリ { mavenCentral() maven { url "https://oss.sonatype.org/content/repositories/snapshots" } } 依存関係 { 実装 'pl.droidsonroids.gif:android-gif-drawable:1.2.+'}
<依存関係> <groupId>pl.droidsonroids.gif</groupId> <artifactId>android-gif-drawable</artifactId> <version>ここに最新バージョンを挿入</version> <type>aar</type> </依存関係>
セットアップ手順を含むサンプル Eclipse プロジェクトを参照してください。
最新リリースのダウンロード
Android 4.2+ (API レベル 17+)
GifTextureView
ハードウェア アクセラレーション レンダリング用
GifTexImage2D
用 OpenGL ES 2.0+
ネイティブ ソースをコンパイルするには Android NDK が必要
sample
ディレクトリを参照してください。サンプルプロジェクトは現在作成中です。まだすべての機能がカバーされているわけではありません。
最も簡単な方法は、通常のImageView
のようにGifImageView
(またはGifImageButton
) を使用することです。
<pl.droidsonroids.gif.GifImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:src="@drawable/src_anim"android:background="@drawable/bg_anim"/>
android:src
および/またはandroid:background
で宣言されたドローアブルが GIF ファイルの場合、それらは自動的にGifDrawable
として認識され、アニメーション化されます。指定されたドローアブルが GIF ではない場合、前述の View はプレーンなImageView
およびImageButton
のように機能します。
GifTextView
使用すると、GIF を複合ドローアブルおよび背景として使用できます。
<pl.droidsonroids.gif.GifTextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:drawableTop="@drawable/left_anim"android:drawableStart="@drawable/left_anim"android:background="@drawable/bg_anim "/>
GifImageView
、 GifImageButton
、およびGifTextView
にも、セッター用のフックが実装されています。したがって、アニメーション GIF はsetImageResource(int resId)
およびsetBackgroundResource(int resId)
を呼び出すことで設定できます。
GifDrawable
さまざまなソースから直接構築できます。
//アセット fileGifDrawable gifFromAssets = new GifDrawable( getAssets(), "anim.gif" ); //リソース (ドローアブルまたは生)GifDrawable gifFromResource = new GifDrawable( getResources(), R.drawable.anim ); //UriContentResolver contentResolver = ... //file:// UrisGifDrawable gifFromUri = new GifDrawable( contentResolver, gifUri );//byte arraybyte[] rawGifBytes = ...GifDrawable gifFromBytes = new GifDrawable( rawGifBytes ); //FileDescriptorFileDescriptor fd = new RandomAccessFile( "/path/anim.gif", "r" ).getFD();GifDrawable gifFromFd = new GifDrawable( fd ); //ファイルパスGifDrawable gifFromPath = new GifDrawable( "/path/anim.gif" ); //fileFile gifFile = new File(getFilesDir(),"anim.gif");GifDrawable gifFromFile = new GifDrawable(gifFile); //AssetFileDescriptorAssetFileDescriptor afd = getAssets().openFd( "anim.gif" );GifDrawable gifFromAfd = new GifDrawable( afd ); //InputStream (マーキングをサポートする必要があります)InputStream sourceIs = ...BufferedInputStream bis = new BufferedInputStream(sourceIs, GIF_LENGTH );GifDrawable gifFromStream = new GifDrawable( bis ); //直接 ByteBufferByteBuffer rawGifBytes = ...GifDrawable gifFromBytes = new GifDrawable( rawGifBytes );
GifDrawable が不要になった場合、InputStream はファイナライザーで自動的に閉じられるため、明示的に閉じる必要はありません。 recycle()
呼び出すと、基礎となる入力ソースも閉じられます。
すべての入力ソースには最初まで巻き戻す機能が必要であることに注意してください。後続のフレームはソースからの要求に応じてデコードされるため、アニメーション GIF (アニメーションが反復可能な場合) を正しく再生する必要があります。
GifDrawable
Animatable
とMediaPlayerControl
を実装しているため、そのメソッドなどを使用できます。
stop()
- アニメーションを停止します。任意のスレッドから呼び出すことができます。
start()
- アニメーションを開始します。任意のスレッドから呼び出すことができます。
isRunning()
- アニメーションが現在実行中かどうかを返します。
reset()
- アニメーションを巻き戻しますが、停止したアニメーションは再開しません
setSpeed(float factor)
- 新しいアニメーション速度係数を設定します。 2.0f を渡すとアニメーション速度が 2 倍になります
seekTo(int position)
- アニメーション (現在のループ内) を指定されたposition
(ミリ秒単位) にシークします。
getDuration()
- アニメーションの 1 ループの継続時間を返します。
getCurrentPosition()
- アニメーションの現在のループの開始からの経過時間を返します。
MediaPlayer の標準コントロール (VideoView など) を使用して、GIF アニメーションを制御し、現在の進行状況を表示できます。
次のように MediaController でGifDrawable
MediaPlayer として設定するだけです。
@Overrideprotected void onCreate(Bundle SavedInstanceState) {super.onCreate(savedInstanceState);GifImageButton gib = new GifImageButton(this);setContentView(gib);gib.setImageResource(R.drawable.sample);final MediaController mc = new MediaController(this) ;mc.setMediaPlayer((GifDrawable) gib.getDrawable());mc.setAnchorView(gib);gib.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {mc.show(); } }); }
getLoopCount()
- NETSCAPE 2.0
拡張機能で定義されているループ数を返します。
getNumberOfFrames()
- フレーム数を返します (少なくとも 1)
getComment()
- コメント テキストを返します (GIF にコメントがない場合はnull
)
getFrameByteCount()
- 単一フレームのピクセルを格納するために使用できる最小バイト数を返します。
getAllocationByteCount()
- 指定された GifDrawable のピクセルを格納するために使用される割り当てられたメモリのサイズ (バイト単位) を返します。
getInputSourceByteCount()
- バッキング入力データの長さ (バイト単位) を返します。
toString()
- 画像サイズとフレーム数に関する人間が判読できる情報を返します (デバッグ目的)
GifDrawable
インスタンスを複数のView
に関連付ける通常、複数のView
に関連付けられた単一のGifDrawable
インスタンスは、最後の View でのみアニメーション化されます。これを解決するには、 MultiCallback
インスタンスを作成し、それにView
を追加し、指定されたドローアブルのコールバックを設定します。例:
MultiCallback multiCallback = new MultiCallback();imageView.setImageDrawable(gifDrawable);multiCallback.addView(imageView);anotherImageView.setImageDrawable(gifDrawable);multiCallback.addView(anotherImageView);gifDrawable.setCallback(multiCallback);
ImageView
などのドローアブルを変更すると、コールバックは前のドローアブルから削除されることに注意してください。その後、コールバックを再割り当てする必要があります。そうしないと、同じGifDrawable
インスタンスのアニメーションが停止します。詳細については、#480 を参照してください。
recycle()
- メモリの解放を高速化するために提供されます ( android.graphics.Bitmap
など)
isRecycled()
- ドローアブルがリサイクルされているかどうかを確認します
getError()
- 最後のエラーの詳細を返します
最小 API レベルは 17 (Android 4.2) になりました。 armeabi
(arm v5 および v6) はサポートされなくなりました。
最小 API レベルは 14 (Android 4.0) になりました。
コンシューマー プロガード ルール (ライブラリにバンドルされている) が使用されていない場合にのみ意味があります (これらは Gradle によってデフォルトで使用されます)。
Proguard ルールが-keep public class pl.droidsonroids.gif.GifIOException{<init>(int, java.lang.String);}
に変更されました。
1.1.17 は、API レベル 8 (Froyo) をサポートする最後のバージョンです。 1.2.0 以降、最小 API レベルは 9 (Gingerbread) です。
いくつかのエッジケースの処理が変更されました。
GifDrawable#getNumberOfFrames()
、 GifDrawable
がリサイクルされるときに 0 を返すようになりました。
GifDrawable
がリサイクルされるときにGifDrawable#toString()
の結果に含まれる情報にはゼロのみが含まれるようになりました。
GifDrawable
を使用する前にLibraryLoader.initialize()
を呼び出すことをお勧めします (必須ではありません)。 Context
、ネイティブ ライブラリを正常に抽出できない場合に必要になります。詳細については、「ReLinker」を参照してください。 LibraryLoader.initialize()
が呼び出されず、通常のライブラリのロードが失敗した場合、 Context
フォールバック方法で取得しようとしますが、常に機能するとは限りません。
int
パラメータのloopNumber
がAnimationListener#onAnimationCompleted()
に追加されました。
Proguard 構成はライブラリにバンドルされているため、自分で指定する必要はありません。
他のライブラリとの競合を避けるために、 GifTextureView
のsrc
XML 属性の名前がgifSource
に変更されました。
Proguard 構成は次のように変更されました。
-keep public class pl.droidsonroids.gif.GifIOException{<init>(int);} -keep class pl.droidsonroids.gif.GifInfoHandle{<init>(long,int,int,int);}
GifDrawable
フレーム バッファーとしてandroid.graphics.Bitmap
使用するようになりました。リサイクルされたGifDrawable
のピクセル (描画を含む) にアクセスしようとするとBitmap
と同様にIllegalStateException
が発生します。
最小 API レベルは 8 (Android 2.2) になりました。
レンダリングはメインスレッドとは独立して実行されるバックグラウンドスレッドで実行されるため、ドローアブルが描画されていなくてもアニメーションは実行されます。ただし、drawable が表示されない場合、レンダリングは実行されません。[#setVisible()](http://developer.android.com/reference/android/graphics/drawable/Drawable.html#setVisible(boolean, boolean)) を参照してください。このメソッドは、Android フレームワークによってまだ処理されていない場合に、ドローアブルの可視性を制御するために使用できます。
このライブラリは、GIFLib 5.1.3 および SKIA のコードを使用します。
イメージファクトリー
NPM で利用可能な Brad Martin による NativeScript プラグイン
Sketch Android 上の強力かつ包括的な画像ローダー。GIF、ジェスチャー ズーム、ブロック表示の超大型画像をサポートします。
あなたのプロジェクトをここに含めたいですか?問題を記入する
MITライセンス
LICENSE ファイルを参照してください。