View
и Drawable
для анимированных GIF-файлов в Android.
Включенная GIFLib через JNI используется для рендеринга кадров. Этот способ должен быть более эффективным, чем классы WebView
или Movie
.
Вставьте следующую зависимость в файл build.gradle
вашего проекта.
зависимости { реализация 'pl.droidsonroids.gif:android-gif-drawable:1.2.29'}
Обратите внимание, что центральный репозиторий Maven должен быть определен, например. в build.gradle
верхнего уровня следующим образом:
сценарий сборки { репозитории { mavenCentral() } } всепроекты { репозитории { mavenCentral() } }
Текущие сборки разработки (сборка из ветки dev
) публикуются в репозитории снимков OSS. Чтобы их использовать, укажите URL репозитория в блоке repositories
:
репозитории { 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>аар</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: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/left_anim"android:background="@drawable/bg_anim" "/>
GifImageView
, GifImageButton
и GifTextView
также имеют реализованные перехватчики для установщиков. Таким образом, анимированные GIF-файлы можно установить, вызвав setImageResource(int resId)
и setBackgroundResource(int resId)
GifDrawable
может быть создан непосредственно из различных источников:
// файл активаGifDrawable gifFromAssets = новый GifDrawable( getAssets(), "anim.gif" ); //ресурс (рисуемый или необработанный)GifDrawable gifFromResource = новый GifDrawable( getResources(), R.drawable.anim); //UriContentResolver contentResolver = ... //может быть нулевым для файла:// UrisGifDrawable gifFromUri = new GifDrawable( contentResolver, gifUri ); //byte arraybyte[] rawGifBytes = ...GifDrawable gifFromBytes = new GifDrawable( rawGifBytes ); //FileDescriptorFileDescriptor fd = новый RandomAccessFile( "/path/anim.gif", "r" ).getFD();GifDrawable gifFromFd = новый GifDrawable(fd); //путь к файлуGifDrawable gifFromPath = новый GifDrawable( "/path/anim.gif"); //fileFile gifFile = новый файл(getFilesDir(),"anim.gif");GifDrawable gifFromFile = новый 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 = новый GifDrawable( rawGifBytes );
Входные потоки автоматически закрываются в финализаторе, если 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 = новый 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
s Обычно один экземпляр GifDrawable
, связанный с несколькими View
, будет анимироваться только в последнем. Чтобы решить эту проблему, создайте экземпляр MultiCallback
, добавьте к нему View
и установите обратный вызов для данного объекта, например:
MultiCallback multiCallback = новый 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
в резервном режиме, что может не всегда работать.
Параметр int
loopNumber
был добавлен в AnimationListener#onAnimationCompleted()
.
Конфигурация Proguard теперь идет в комплекте с библиотекой, ее не нужно указывать самостоятельно.
Атрибут XML src
в 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 от Брэда Мартина доступен на NPM
Sketch Мощный и комплексный загрузчик изображений на Android с поддержкой GIF, масштабированием жестами, блочным отображением сверхбольших изображений.
Хотите разместить здесь свой проект? Заполните задачу
Лицензия MIT
См. файл ЛИЦЕНЗИИ.