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> <版本>在此插入最新版本</版本> <類型>aar</類型> </依賴>
請參閱帶有設定說明的範例 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,那麼提到的視圖就像普通的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/ground_anim"andraw/ground ”/>
GifImageView
、 GifImageButton
和GifTextView
也實作了設定器的鉤子。因此可以透過呼叫setImageResource(int resId)
和setBackgroundResource(int resId)
來設定動畫GIF
GifDrawable
可以直接從各種來源建構:
//資源檔案GifDrawable gifFromAssets = new GifDrawable( getAssets(), "anim.gif" ); //資源(可繪製或原始)GifDrawable gifFromResource = new GifDrawable( getResources(), R.drawable.anim ); //UriContentResolver contentResolver = ... //對於file:// UrisGifDrawable gifFromUri = new GifDrawable( contentResolver, gifUri );//位元組陣列byte[] rawGifBytes = ...GifDrawable gifFromBytes = raw GifDableytespfidableBactesm null //FileDescriptorFileDescriptor fd = new RandomAccessFile( "/path/anim.gif", "r" ).getFD();GifDrawable gifFromFd = new GifDrawable( fd ); //檔案路徑GifDrawable gifFromPath = new GifDrawable( "/path/anim.gif" ); //檔案檔案 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,InputStreams 將在終結器中自動關閉,因此您無需明確關閉它們。呼叫recycle()
也會關閉底層輸入來源。
請注意,所有輸入來源都需要能夠倒回開頭。需要正確播放動畫 GIF(其中動畫是可重複的),因為後續幀是根據來源的需要進行解碼的。
GifDrawable
實作了Animatable
和MediaPlayerControl
因此您可以使用它的方法和更多功能:
stop()
- 停止動畫,可以從任何執行緒調用
start()
- 啟動動畫,可以從任何執行緒調用
isRunning()
- 返回動畫目前是否正在運行
reset()
- 倒帶動畫,不重新啟動停止的動畫
setSpeed(float factor)
- 設定新的動畫速度因子,例如。通過 2.0f 將使動畫速度加倍
seekTo(int position)
- 尋找動畫(在當前循環內)到給定position
(以毫秒為單位)
getDuration()
- 傳回動畫一個循環的持續時間
getCurrentPosition()
- 傳回從目前動畫循環開始起經過的時間
MediaPlayer 的標準控制(如 VideoView 中)可用於控制 GIF 動畫並顯示其當前進度。
只需將GifDrawable
設定為 MediaController 上的 MediaPlayer,如下所示:
@Overrideprotected void onCreate(Bundle savingInstanceState) {super.onCreate(savedInstanceState);GifImageButton gib = new GifImageButton(this);setContentView(gib); ;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
實例將僅在最後一個上設定動畫。若要解決建立MultiCallback
實例的問題,請在其中新增View
並為給定的可繪製物件設定回調,例如:
MultiCallback multiCallback = new MultiCallback();imageView.setImageDrawable(gifDrawable);multiCallback.addView(imageView);anotherImageView.setImageDrawable(gifDrawable);
請注意,如果您變更ImageView
等可繪製對象,則回呼將從先前的可繪製對像中刪除。此後,您必須重新指派回調,否則同一個GifDrawable
實例將停止動畫。有關更多信息,請參閱#480。
recycle()
- 提供加速釋放記憶體(如android.graphics.Bitmap
)
isRecycled()
- 檢查drawable是否被回收
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
被回收時, GifDrawable#getNumberOfFrames()
現在傳回 0
當GifDrawable
被回收時, GifDrawable#toString()
結果中包含的資訊現在只包含零
建議(但不要求)在使用GifDrawable
之前呼叫LibraryLoader.initialize()
。在某些無法正常提取本機庫的情況下,需要Context
。有關更多詳細信息,請參閱重新連結器。如果未呼叫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
的像素(包括繪圖)將導致IllegalStateException
就像Bitmap
中一樣。
最低 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 的程式碼。
圖像工廠
Brad Martin 的 NativeScript 外掛程式可在 NPM 上使用
Sketch Android 上強大且全面的圖像載入器,支援 GIF、手勢縮放、塊顯示超大圖像。
想在這裡包含您的項目嗎?填寫問題
麻省理工學院許可證
請參閱許可證文件。