##WayGif
Android-приложение использует JNI для анализа и отображения GIF-изображений, что повышает эффективность и скорость работы.
Исходный проект взят с GitHub: android-gif-drawable
##Простое использование
###В файле XML разметки:
Используйте
GifImageView
(или GifImageButton
) так же, как и обычный ImageView
:
<com.way.gif.GifImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/src_anim"
android:background="@drawable/bg_anim"
/>
Если android:src
или android:background
указывают на GIF-файл, приложение автоматически начнет воспроизведение.
GifTextView
позволяет использовать GIF-файл в качестве фона.
<com.way.gif.GifTextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:drawableTop="@drawable/left_anim"
android:drawableStart="@drawable/left_anim"
android:background="@drawable/bg_anim"
/>
###В коде Java:
GifImageView
, GifImageButton
и GifTextView
могут использовать методы setImageResource(int resId)
и setBackgroundResource(int resId)
для установки GIF-изображений.
GifDrawable
также можно создать напрямую в коде:
//asset file
GifDrawable gifFromAssets = new GifDrawable(getAssets(), "anim.gif");
//resource (drawable or raw)
GifDrawable gifFromResource = new GifDrawable(getResources(), R.drawable.anim);
//byte array
byte[] rawGifBytes = ...;
GifDrawable gifFromBytes = new GifDrawable(rawGifBytes);
//FileDescriptor
FileDescriptor fd = new RandomAccessFile("/path/anim.gif", "r").getFD();
GifDrawable gifFromFd = new GifDrawable(fd);
//file path
GifDrawable gifFromPath = new GifDrawable("/path/anim.gif");
//file
File gifFile = new File(getFilesDir(), "anim.gif");
GifDrawable gifFromFile = new GifDrawable(gifFile);
//AssetFileDescriptor
AssetFileDescriptor 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);
//прямой ByteBuffer
ByteBuffer 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)` - перемещает анимацию (в пределах текущего цикла) на указанную позицию (в миллисекундах) __Поддерживается только перемещение вперед__
+ `getDuration()` - возвращает продолжительность одного цикла анимации + `getCurrentPosition()` - возвращает время, прошедшее с начала текущего цикла анимации
#####Использование [MediaPlayerControl](http://developer.android.com/reference/android/widget/MediaPlayerControl.html)
Стандартные средства управления для MediaPlayer (как в [VideoView](http://developer.android.com/reference/android/widget/VideoView.html)) могут быть использованы для управления анимацией GIF и отображения текущего прогресса.
Просто установите `GifDrawable` как MediaPlayer на вашем [MediaController](http://developer.android.com/reference/android/widget/MediaController.html) следующим образом:
```java
@Override
protected void onCreate(Bundle savedInstanceState)
{
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()
{
@Override
public void onClick(View v)
{
mc.show();
}
});
}
####Получение метаданных GIF
getLoopCount()
- возвращает количество циклов, определенное в расширении NETSCAPE 2.0
getNumberOfFrames()
- возвращает количество кадров (не менее одного)getComment()
- возвращает текст комментария (null
если GIF не имеет комментария)getFrameByteCount()
- возвращает минимальное количество байт, которое может быть использовано для хранения пикселей одного кадраgetAllocationByteCount()
- возвращает размер (в байтах) выделенной памяти, используемой для хранения пикселей данного GifDrawablegetInputSourceByteCount()
- возвращает длину (в байтах) исходных входных данных+ toString()
- возвращает читаемую человеком информацию о размере изображения и количестве кадров (назначена для целей отладки)
####Продвинутое
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )