View
และ Drawable
สำหรับ GIF แบบเคลื่อนไหวใน Android
GIFLib ที่รวมผ่าน JNI ใช้ในการเรนเดอร์เฟรม วิธีนี้ควรมีประสิทธิภาพมากกว่าคลาส WebView
หรือ Movie
แทรกการพึ่งพาต่อไปนี้ในไฟล์ build.gradle
ของโครงการของคุณ
การพึ่งพา { การใช้งาน 'pl.droidsonroids.gif:android-gif-drawable:1.2.29'}
โปรดทราบว่าควรกำหนดพื้นที่เก็บข้อมูลส่วนกลางของ Maven เช่น ใน build.gradle
ระดับบนสุดเช่นนี้:
บิลด์สคริปต์ { ที่เก็บ { มาเวนเซ็นทรัล() - - โครงการทั้งหมด { ที่เก็บ { มาเวนเซ็นทรัล() - -
บิลด์การพัฒนาปัจจุบัน (บิลด์จากสาขา dev
) ได้รับการเผยแพร่ไปยังที่เก็บสแน็ปช็อต OSS หากต้องการใช้งาน ให้ระบุ URL ของที่เก็บในบล็อก repositories
:
ที่เก็บ { มาเวนเซ็นทรัล() มาเวน { 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>เอ๋</ประเภท> </การพึ่งพา>
ดูตัวอย่างโปรเจ็กต์ eclipse พร้อมคำแนะนำในการตั้งค่า
ดาวน์โหลดรุ่นล่าสุด
Android 4.2+ (ระดับ API 17+)
สำหรับการเรนเดอร์แบบเร่งด้วยฮาร์ดแวร์ GifTextureView
สำหรับ GifTexImage2D
OpenGL ES 2.0+
จำเป็นต้องใช้ Android NDK เพื่อรวบรวมแหล่งข้อมูลดั้งเดิม
ดูไดเร็กทอรี sample
โครงการตัวอย่างอยู่ระหว่างการก่อสร้าง คุณสมบัติยังไม่ครอบคลุมทั้งหมด
วิธีที่ง่ายที่สุดคือใช้ GifImageView
(หรือ GifImageButton
) เหมือน ImageView
ปกติ:
<pl.droidsonroids.gif.GifImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:src="@drawable/src_anim"android:พื้นหลัง="@drawable/bg_anim"/>
หาก Drawable ที่ประกาศโดย android:src
และ/หรือ android:background
เป็นไฟล์ GIF ไฟล์เหล่านั้นจะได้รับการยอมรับโดยอัตโนมัติว่าเป็น GifDrawable
และภาพเคลื่อนไหว หาก Drawable ที่กำหนดไม่ใช่ GIF แล้ว Views ที่กล่าวถึงจะทำงานเหมือนกับ 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:พื้นหลัง="@drawable/bg_anim "/>
GifImageView
, GifImageButton
และ GifTextView
ยังมี hooks สำหรับผู้ตั้งค่าที่นำไปใช้ ดังนั้นสามารถตั้งค่า GIF แบบเคลื่อนไหวได้โดยการเรียก setImageResource(int resId)
และ setBackgroundResource(int resId)
GifDrawable
สามารถสร้างได้โดยตรงจากแหล่งต่างๆ:
//asset fileGifDrawable gifFromAssets = new GifDrawable( getAssets(), "anim.gif" ); //ทรัพยากร (drawable หรือ raw)GifDrawable gifFromResource = new GifDrawable( getResources(), R.drawable.anim ); //UriContentResolver contentResolver = ... // สามารถเป็นโมฆะสำหรับไฟล์: // 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 ); // ไฟล์ pathGifDrawable gifFromPath = GifDrawable ใหม่ ( "/path/anim.gif" ); //fileFile gifFile = ไฟล์ใหม่ (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 ); //Direct ByteBufferByteBuffer rawGifBytes = ...GifDrawable gifFromBytes = GifDrawable ใหม่ ( rawGifBytes );
InputStreams จะถูกปิดโดยอัตโนมัติใน Finalizer หากไม่จำเป็นต้องใช้ GifDrawable อีกต่อไป ดังนั้นคุณไม่จำเป็นต้องปิดมันอย่างชัดเจน การเรียก recycle()
จะปิดแหล่งอินพุตพื้นฐานด้วย
โปรดทราบว่าแหล่งอินพุตทั้งหมดจำเป็นต้องมีความสามารถในการย้อนกลับไปยังจุดเริ่มต้น จำเป็นต้องเล่น GIF แบบเคลื่อนไหวอย่างถูกต้อง (ซึ่งสามารถเล่นภาพเคลื่อนไหวซ้ำได้) เนื่องจากเฟรมที่ตามมาจะถูกถอดรหัสตามความต้องการจากแหล่งที่มา
GifDrawable
ใช้ Animatable
และ MediaPlayerControl
เพื่อให้คุณสามารถใช้วิธีการต่างๆ ของมันและอื่นๆ อีกมากมาย:
stop()
- หยุดภาพเคลื่อนไหว สามารถเรียกจากเธรดใดก็ได้
start()
- เริ่มแอนิเมชั่น สามารถเรียกจากเธรดใดก็ได้
isRunning()
- คืนค่าว่าแอนิเมชั่นกำลังทำงานอยู่หรือไม่
reset()
- ย้อนกลับแอนิเมชั่น ไม่รีสตาร์ทหนึ่งอันที่หยุดไว้
setSpeed(float factor)
- ตั้งค่าปัจจัยความเร็วแอนิเมชั่นใหม่ เช่น การผ่าน 2.0f จะเพิ่มความเร็วของภาพเคลื่อนไหวเป็นสองเท่า
seekTo(int position)
- ค้นหาภาพเคลื่อนไหว (ภายในลูปปัจจุบัน) ไปยัง position
ที่กำหนด (เป็นมิลลิวินาที)
getDuration()
- ส่งคืนระยะเวลาหนึ่งลูปของแอนิเมชั่น
getCurrentPosition()
- ส่งกลับเวลาที่ผ่านไปจากจุดเริ่มต้นของการวนซ้ำของแอนิเมชั่นปัจจุบัน
การควบคุมมาตรฐานสำหรับ MediaPlayer (เช่นใน VideoView) สามารถใช้เพื่อควบคุมภาพเคลื่อนไหว GIF และแสดงความคืบหน้าในปัจจุบัน
เพียงตั้งค่า GifDrawable
เป็น MediaPlayer บน MediaController ของคุณดังนี้:
@Overrideprotected void onCreate (Bundle SavedInstanceState) {super.onCreate (savedInstanceState); GifImageButton gib = new GifImageButton (นี้); setContentView (gib); gib.setImageResource (R.drawable.sample); สุดท้าย MediaController mc = ใหม่ MediaController (นี้) ;mc.setMediaPlayer((GifDrawable) gib.getDrawable());mc.setAnchorView(gib);gib.setOnClickListener(ใหม่ OnClickListener() {@Overridepublic เป็นโมฆะ onClick (ดู v) {mc.show(); - - -
getLoopCount()
- ส่งคืนจำนวนการวนซ้ำตามที่กำหนดไว้ในส่วนขยาย NETSCAPE 2.0
getNumberOfFrames()
- ส่งกลับจำนวนเฟรม (อย่างน้อย 1)
getComment()
- ส่งคืนข้อความแสดงความคิดเห็น ( null
ถ้า GIF ไม่มีความคิดเห็น)
getFrameByteCount()
- ส่งกลับจำนวนไบต์ขั้นต่ำที่สามารถใช้เพื่อจัดเก็บพิกเซลของเฟรมเดียว
getAllocationByteCount()
- ส่งกลับขนาด (เป็นไบต์) ของหน่วยความจำที่จัดสรรซึ่งใช้ในการจัดเก็บพิกเซลของ GifDrawable ที่กำหนด
getInputSourceByteCount()
- ส่งคืนความยาว (เป็นไบต์) ของข้อมูลอินพุตสำรอง
toString()
- ส่งคืนข้อมูลที่มนุษย์สามารถอ่านได้เกี่ยวกับขนาดรูปภาพและจำนวนเฟรม (มีจุดประสงค์เพื่อการแก้ไขจุดบกพร่อง)
GifDrawable
เดียวกับหลาย View
โดยปกติอินสแตนซ์ GifDrawable
เดียวที่เชื่อมโยงกับหลาย View
จะเคลื่อนไหวเฉพาะในอันสุดท้ายเท่านั้น หากต้องการแก้ปัญหาที่สร้างอินสแตนซ์ MultiCallback
ให้เพิ่ม View
เข้าไปและตั้งค่าการโทรกลับสำหรับ Drawable ที่กำหนด เช่น:
MultiCallback multiCallback = ใหม่ MultiCallback();imageView.setImageDrawable(gifDrawable);multiCallback.addView(imageView);anotherImageView.setImageDrawable(gifDrawable);multiCallback.addView(anotherImageView);gifDrawable.setCallback(multiCallback);
โปรดทราบว่าหากคุณเปลี่ยน Drawable เช่น ImageView
การโทรกลับจะถูกลบออกจาก Drawable ก่อนหน้า หลังจากนั้น คุณจะต้องกำหนดการเรียกกลับใหม่ ไม่เช่นนั้นอินสแตนซ์ GifDrawable
เดียวกันจะหยุดเคลื่อนไหว ดูข้อมูลเพิ่มเติมที่ #480
recycle()
- มีไว้เพื่อเพิ่มความเร็วในการเพิ่มหน่วยความจำ (เช่นใน android.graphics.Bitmap
)
isRecycled()
- ตรวจสอบว่าสามารถดึงออกมารีไซเคิลได้หรือไม่
getError()
- ส่งคืนรายละเอียดข้อผิดพลาดล่าสุด
ระดับ API ขั้นต่ำตอนนี้คือ 17 (Android 4.2) ไม่รองรับ armeabi
(arm v5 และ v6) อีกต่อไป
ระดับ API ขั้นต่ำตอนนี้คือ 14 (Android 4.0)
มีความหมายเฉพาะในกรณีที่ ไม่ได้ ใช้กฎ proguard ของผู้บริโภค (มาพร้อมกับไลบรารี) (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)
การจัดการ Edge Case หลายรายการมีการเปลี่ยนแปลง:
GifDrawable#getNumberOfFrames()
จะส่งคืนค่า 0 เมื่อ GifDrawable
ถูกรีไซเคิล
ข้อมูลที่รวมอยู่ในผลลัพธ์ของ GifDrawable#toString()
เมื่อ GifDrawable
ถูกรีไซเคิลตอนนี้มีเพียงศูนย์เท่านั้น
ขอแนะนำ (แต่ไม่จำเป็น) ให้เรียก LibraryLoader.initialize()
ก่อนใช้งาน GifDrawable
จำเป็นต้องมี Context
ในบางกรณีเมื่อไม่สามารถแตกไลบรารีดั้งเดิมได้ตามปกติ ดู ReLinker สำหรับรายละเอียดเพิ่มเติม หากไม่ได้เรียก LibraryLoader.initialize()
และการโหลดไลบรารีปกติล้มเหลว Context
จะพยายามดึงข้อมูลด้วยวิธีถอยกลับซึ่งอาจไม่ทำงานเสมอไป
เพิ่มพารามิเตอร์ int
loopNumber
ให้กับ AnimationListener#onAnimationCompleted()
แล้ว
ขณะนี้การกำหนดค่า Proguard รวมอยู่ในไลบรารีแล้ว คุณไม่จำเป็นต้องระบุด้วยตนเอง
แอตทริบิวต์ src
XML ใน GifTextureView
ได้รับการเปลี่ยนชื่อเป็น 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)) วิธีการดังกล่าวสามารถใช้เพื่อควบคุมการมองเห็น Drawable ในกรณีที่กรอบงาน Android ไม่ได้จัดการอยู่แล้ว
ไลบรารีนี้ใช้โค้ดจาก GIFLib 5.1.3 และ SKIA
ImageFactory
ปลั๊กอิน NativeScript โดย Brad Martin มีอยู่ใน NPM
Sketch ตัวโหลดรูปภาพที่ทรงพลังและครอบคลุมบน Android พร้อมรองรับ GIF การซูมด้วยท่าทาง บล็อกการแสดงภาพขนาดใหญ่พิเศษ
ต้องการรวมโครงการของคุณที่นี่หรือไม่? กรอกประเด็น
ใบอนุญาตเอ็มไอที
ดูไฟล์ใบอนุญาต