View
s dan Drawable
untuk GIF animasi di Android.
GIFLib yang dibundel melalui JNI digunakan untuk merender bingkai. Cara ini seharusnya lebih efisien daripada kelas WebView
atau Movie
.
Masukkan ketergantungan berikut ke file build.gradle
proyek Anda.
ketergantungan { implementasi 'pl.droidsonroids.gif:android-gif-drawable:1.2.29'}
Perhatikan bahwa repositori pusat Maven harus didefinisikan misalnya. di build.gradle
tingkat atas seperti ini:
skrip pembangunan { repositori { pakarPusat() } } semua proyek { repositori { pakarPusat() } }
Build pengembangan saat ini (build dari cabang dev
) dipublikasikan ke repositori snapshot OSS. Untuk menggunakannya, tentukan URL repositori di blok repositories
:
repositori { pakarPusat() pakar { url "https://oss.sonatype.org/content/repositories/snapshots" } } ketergantungan { implementasi 'pl.droidsonroids.gif:android-gif-drawable:1.2.+'}
<ketergantungan> <groupId>pl.droidsonroids.gif</groupId> <artifactId>android-gif-drawable</artifactId> <version>masukkan versi terbaru di sini</version> <type>aar</type> </ketergantungan>
Lihat Contoh proyek gerhana dengan instruksi pengaturan.
Unduhan rilis terbaru
Android 4.2+ (API tingkat 17+)
untuk rendering yang dipercepat perangkat keras GifTextureView
untuk GifTexImage2D
OpenGL ES 2.0+
Android NDK diperlukan untuk mengkompilasi sumber asli
Lihat direktori sample
. Contoh proyek sedang dibangun. Belum semua fitur tercakup.
Cara paling sederhana adalah dengan menggunakan GifImageView
(atau GifImageButton
) seperti ImageView
biasa :
<pl.droidsonroids.gif.GifImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:src="@drawable/src_anim"android:background="@drawable/bg_anim"/>
Jika drawable yang dideklarasikan oleh android:src
dan/atau android:background
adalah file GIF, maka drawable tersebut akan otomatis dikenali sebagai GifDrawable
dan dianimasikan. Jika drawable yang diberikan bukan GIF maka Tampilan yang disebutkan berfungsi seperti ImageView
dan ImageButton
biasa.
GifTextView
memungkinkan Anda menggunakan GIF sebagai sumber daya dapat digambar dan latar belakang gabungan.
<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
dan GifTextView
juga menerapkan kait untuk penyetel. Jadi GIF animasi dapat diatur dengan memanggil setImageResource(int resId)
dan setBackgroundResource(int resId)
GifDrawable
dapat dibuat langsung dari berbagai sumber:
//file asetGifDrawable gifFromAssets = GifDrawable baru( getAssets(), "anim.gif" ); //sumber daya (dapat digambar atau mentah)GifDrawable gifFromResource = new GifDrawable( getResources(), R.drawable.anim ); //UriContentResolver contentResolver = ... //bisa menjadi null untuk 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 ); //file pathGifDrawable gifFromPath = new GifDrawable( "/path/anim.gif" ); //fileFile gifFile = File baru(getFilesDir(),"anim.gif");GifDrawable gifFromFile = GifDrawable baru(gifFile); //AssetFileDescriptorAssetFileDescriptor afd = getAssets().openFd( "anim.gif" );GifDrawable gifFromAfd = new GifDrawable( afd ); //InputStream (harus mendukung penandaan)InputStream sourceIs = ...BufferedInputStream bis = new BufferedInputStream( sourceIs, GIF_LENGTH );GifDrawable gifFromStream = new GifDrawable( bis ); //langsung ByteBufferByteBuffer rawGifBytes = ...GifDrawable gifFromBytes = GifDrawable baru( rawGifBytes );
InputStreams ditutup secara otomatis di finalizer jika GifDrawable tidak lagi diperlukan sehingga Anda tidak perlu menutupnya secara eksplisit. Memanggil recycle()
juga akan menutup sumber masukan yang mendasarinya.
Perhatikan bahwa semua sumber masukan harus memiliki kemampuan untuk memundurkan ke awal. Diperlukan untuk memutar GIF animasi dengan benar (di mana animasi dapat diulang) karena frame berikutnya didekodekan berdasarkan permintaan dari sumber.
GifDrawable
mengimplementasikan Animatable
dan MediaPlayerControl
sehingga Anda dapat menggunakan metodenya dan lainnya:
stop()
- menghentikan animasi, dapat dipanggil dari thread mana pun
start()
- memulai animasi, dapat dipanggil dari thread mana saja
isRunning()
- mengembalikan apakah animasi sedang berjalan atau tidak
reset()
- memundurkan animasi, tidak memulai ulang animasi yang dihentikan
setSpeed(float factor)
- menyetel faktor kecepatan animasi baru, misalnya. melewati 2.0f akan menggandakan kecepatan animasi
seekTo(int position)
- mencari animasi (dalam loop saat ini) ke position
tertentu (dalam milidetik)
getDuration()
- mengembalikan durasi satu putaran animasi
getCurrentPosition()
- mengembalikan waktu yang telah berlalu dari awal putaran animasi saat ini
Kontrol standar untuk MediaPlayer (seperti di VideoView) dapat digunakan untuk mengontrol animasi GIF dan menampilkan kemajuannya saat ini.
Cukup atur GifDrawable
sebagai MediaPlayer di MediaController Anda seperti ini:
@Overrideprotected void onCreate(Bundel disimpanInstanceState) {super.onCreate(savedInstanceState);GifImageButton gib = new GifImageButton(this);setContentView(gib);gib.setImageResource(R.drawable.sample);final MediaController mc = new MediaController(ini) ;mc.setMediaPlayer((GifDrawable) gib.getDrawable());mc.setAnchorView(gib);gib.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {mc.show(); } }); }
getLoopCount()
- mengembalikan jumlah loop seperti yang didefinisikan dalam ekstensi NETSCAPE 2.0
getNumberOfFrames()
- mengembalikan jumlah frame (setidaknya 1)
getComment()
- mengembalikan teks komentar ( null
jika GIF tidak memiliki komentar)
getFrameByteCount()
- mengembalikan jumlah byte minimum yang dapat digunakan untuk menyimpan piksel dari satu frame
getAllocationByteCount()
- mengembalikan ukuran (dalam byte) dari memori yang dialokasikan yang digunakan untuk menyimpan piksel GifDrawable yang diberikan
getInputSourceByteCount()
- mengembalikan panjang (dalam byte) data masukan pendukung
toString()
- mengembalikan informasi yang dapat dibaca manusia tentang ukuran gambar dan jumlah frame (dimaksudkan untuk tujuan debugging)
GifDrawable
dengan beberapa View
Biasanya satu instance GifDrawable
yang dikaitkan dengan beberapa View
hanya akan dianimasikan pada instance terakhir. Untuk mengatasi pembuatan instance MultiCallback
itu, tambahkan View
ke dalamnya dan atur callback untuk drawable tertentu, misalnya:
MultiCallback multiCallback = new MultiCallback();imageView.setImageDrawable(gifDrawable);multiCallback.addView(imageView);anotherImageView.setImageDrawable(gifDrawable);multiCallback.addView(anotherImageView);gifDrawable.setCallback(multiCallback);
Perhatikan bahwa jika Anda mengubah sumber daya dapat digambar, misalnya ImageView
, callback akan dihapus dari sumber daya dapat digambar sebelumnya. Setelah itu, Anda harus menetapkan ulang panggilan balik atau instance GifDrawable
yang sama akan berhenti dianimasikan. Lihat #480 untuk informasi lebih lanjut.
recycle()
- disediakan untuk mempercepat pembebasan memori (seperti di android.graphics.Bitmap
)
isRecycled()
- memeriksa apakah drawable didaur ulang
getError()
- mengembalikan detail kesalahan terakhir
Level API minimum sekarang adalah 17 (Android 4.2). armeabi
(arm v5 dan v6) tidak lagi didukung.
Level API minimum sekarang adalah 14 (Android 4.0).
Berarti hanya jika aturan proguard konsumen (dipaketkan dengan perpustakaan) tidak digunakan (aturan tersebut digunakan secara default oleh Gradle).
Aturan Proguard telah diubah menjadi -keep public class pl.droidsonroids.gif.GifIOException{<init>(int, java.lang.String);}
1.1.17 adalah versi terakhir yang mendukung API level 8 (Froyo). Mulai dari 1.2.0 API level minimum adalah 9 (Gingerbread).
Penanganan beberapa kasus edge telah diubah:
GifDrawable#getNumberOfFrames()
kini mengembalikan 0 saat GifDrawable
didaur ulang
Informasi yang disertakan dalam hasil GifDrawable#toString()
saat GifDrawable
didaur ulang kini hanya berisi angka nol
Disarankan (tetapi tidak wajib) untuk memanggil LibraryLoader.initialize()
sebelum menggunakan GifDrawable
. Context
diperlukan dalam beberapa kasus ketika perpustakaan asli tidak dapat diekstraksi secara normal. Lihat ReLinker untuk lebih jelasnya. Jika LibraryLoader.initialize()
tidak dipanggil dan pemuatan perpustakaan normal gagal, Context
akan dicoba diambil dengan cara mundur yang mungkin tidak selalu berhasil.
parameter int
loopNumber
telah ditambahkan ke AnimationListener#onAnimationCompleted()
.
Konfigurasi Proguard kini disertakan dengan pustaka, Anda tidak perlu menentukannya sendiri.
Atribut src
XML di GifTextureView
telah diubah namanya menjadi gifSource
untuk menghindari kemungkinan konflik dengan perpustakaan lain.
Konfigurasi Proguard telah berubah menjadi:
-keep public class pl.droidsonroids.gif.GifIOException{<init>(int);} -keep class pl.droidsonroids.gif.GifInfoHandle{<init>(long,int,int,int);}
GifDrawable
sekarang menggunakan android.graphics.Bitmap
sebagai buffer bingkai. Mencoba mengakses piksel (termasuk gambar) dari GifDrawable
daur ulang akan menyebabkan IllegalStateException
seperti di Bitmap
.
Level API minimum sekarang adalah 8 (Android 2.2).
Rendering dilakukan di thread latar belakang yang berjalan secara terpisah dari thread utama sehingga animasi tetap berjalan meskipun sumber daya dapat digambar tidak digambar. Namun rendering tidak berjalan jika drawable tidak terlihat, lihat [#setVisible()](http://developer.android.com/reference/android/graphics/drawable/Drawable.html#setVisible(boolean, boolean)). Metode tersebut dapat digunakan untuk mengontrol visibilitas drawable jika belum ditangani oleh framework Android.
Perpustakaan ini menggunakan kode dari GIFLib 5.1.3 dan SKIA.
Pabrik Gambar
Plugin NativeScript oleh Brad Martin tersedia di NPM
Sketsa Pemuat gambar yang kuat dan komprehensif di Android, dengan dukungan untuk GIF, pembesaran gerakan, tampilan blok gambar super besar.
Ingin memasukkan proyek Anda di sini? Isi masalah
Lisensi MIT
Lihat file LISENSI.