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
:
المستودعات { مافن سنترال () مخضرم { رابط "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> <نوع>آر</نوع> </التبعية>
راجع نموذج مشروع Eclipse مع تعليمات الإعداد.
أحدث تنزيلات الإصدار
أندرويد 4.2+ (مستوى واجهة برمجة التطبيقات 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:background="@drawable/bg_anim"/>
إذا تم الإعلان عن الرسوميات بواسطة android:src
و/أو android:background
فهي ملفات GIF، فسيتم التعرف عليها تلقائيًا على أنها GifDrawable
s وصور متحركة. إذا لم يكن الرسم القابل للرسم عبارة عن صورة 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/left_anim" android: background = "@ drawable/bg_anim" "/>
تحتوي GifImageView
و GifImageButton
و GifTextView
أيضًا على خطافات للأدوات المطبقة. لذلك يمكن تعيين صور GIF المتحركة عن طريق استدعاء setImageResource(int resId)
و setBackgroundResource(int resId)
يمكن إنشاء GifDrawable
مباشرة من مصادر مختلفة:
// ملف الأصولGifDrawable gifFromAssets = new GifDrawable( getAssets(), "anim.gif" ); // المورد (قابل للرسم أو خام)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 ); // مسار الملف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 );
يتم إغلاق InputStreams تلقائيًا في أداة الإنهاء إذا لم تعد هناك حاجة إلى 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 saveInstanceState) {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()
- يُرجع نص التعليق ( null
إذا لم يكن لدى GIF أي تعليق)
getFrameByteCount()
- يُرجع الحد الأدنى لعدد البايتات التي يمكن استخدامها لتخزين وحدات البكسل في الإطار الفردي
getAllocationByteCount()
- يُرجع الحجم (بالبايت) للذاكرة المخصصة المستخدمة لتخزين وحدات البكسل الخاصة بـ GifDrawable المحدد
getInputSourceByteCount()
- يُرجع الطول (بالبايت) لبيانات إدخال الدعم
toString()
- يُرجع معلومات يمكن قراءتها بواسطة الإنسان حول حجم الصورة وعدد الإطارات (مخصص لغرض تصحيح الأخطاء)
GifDrawable
واحد بطرق 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()
يُرجع الآن 0 عند إعادة تدوير GifDrawable
المعلومات المضمنة في نتيجة GifDrawable#toString()
عند إعادة تدوير GifDrawable
تحتوي الآن على أصفار فقط
يوصى (ولكن ليس مطلوبًا) باستدعاء LibraryLoader.initialize()
قبل استخدام GifDrawable
. Context
مطلوب في بعض الحالات عندما لا يمكن استخراج المكتبات الأصلية بشكل طبيعي. راجع ReLinker لمزيد من التفاصيل. إذا لم يتم استدعاء LibraryLoader.initialize()
وفشل التحميل العادي للمكتبة، فستتم محاولة استرداد Context
بطريقة رجوعية والتي قد لا تعمل دائمًا.
تمت إضافة loopNumber
المعلمة int
إلى 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).
يتم تنفيذ العرض في سلسلة الخلفية التي تعمل بشكل مستقل عن السلسلة الرئيسية بحيث يتم تشغيل الرسوم المتحركة حتى لو لم يتم رسمها. ومع ذلك، لا يتم تشغيل العرض إذا كان الرسم غير مرئي، راجع [#setVisible()](http://developer.android.com/reference/android/graphics/drawable/Drawable.html#setVisible(boolean, boolean)). يمكن استخدام هذه الطريقة للتحكم في الرؤية القابلة للرسم في الحالات التي لا تتم معالجتها بالفعل بواسطة إطار عمل Android.
تستخدم هذه المكتبة التعليمات البرمجية من GIFLib 5.1.3 وSKIA.
ImageFactory
NativeScript Plugin من براد مارتن متاح على NPM
Sketch أداة تحميل صور قوية وشاملة على نظام Android، مع دعم GIF وتكبير الإيماءات وعرض الصور الكبيرة جدًا.
هل تريد إدراج مشروعك هنا؟ املأ مشكلة
رخصة معهد ماساتشوستس للتكنولوجيا
انظر ملف الترخيص.