Android-приложение использует JNI для анализа и отображения GIF-изображений более эффективно и быстро.
Исходный проект взят с GitHub: android-gif-drawable
Как обычный ImageView
используется GifImageView
(или GifImageButton
):
<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"
/>
Методы setImageResource(int resId)
и setBackgroundResource(int resId)
могут использоваться для установки GIF-изображений в GifImageView
, GifImageButton
и GifTextView
.
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 (it must support marking)
InputStream sourceIs = ...
BufferedInputStream bis = new BufferedInputStream(sourceIs, GIF_LENGTH);
GifDrawable gifFromStream = new GifDrawable(bis);
//direct ByteBuffer
ByteBuffer rawGifBytes = ...
GifDrawable gifFromBytes = new GifDrawable(rawGifBytes);
InputStream
закроются автоматически, когда GifDrawable
больше не используется, поэтому нет необходимости специально закрывать его, хотя можно вызвать метод recycle()
.
Обратите внимание, что все входные источники должны иметь возможность перемотки до начала. Это требуется для правильного воспроизведения анимированного GIF (где анимация повторяется), так как последующие кадры декодируются по мере необходимости из источника.
GifDrawable
реализует интерфейсы Animatable
и MediaPlayerControl
, позволяющие использовать следующие методы:
stop()
— останавливает анимацию, может быть вызвана из любого потокаstart()
— начинает анимацию, может быть вызвана из любого потокаisRunning()
— возвращает значение, указывающее, выполняется ли анимация в данный моментreset()
— перематывает анимацию, но не перезапускает остановленнуюsetSpeed(float factor)
— устанавливает новый коэффициент скорости анимации, например передача значения Yöntem 2.0f удвоит скорость анимацииseekTo(int position)
— перемещает позицию анимации (в рамках текущего цикла) до указанной позиции (в миллисекундах) Поддерживается только перемотка вперёд
getDuration()
— возвращает продолжительность одного цикла анимацииgetCurrentPosition()
— возвращает время, прошедшее с начала текущего цикла анимацииСтандартные средства управления медиа (как в VideoView) могут использоваться для управления анимацией GIF и показа её текущего прогресса.
Просто установите GifDrawable
как объект MediaPlayer в вашем MediaController таким образом:
@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();
}
});
}
getLoopCount()
— возвращает количество повторений, определённое в расширении NETSCAPE 2.0
getNumberOfFrames()
— возвращает число кадров (не менее одного)getComment()
— возвращает текстовое сообщение (null если GIF не имеет комментария)getFrameByteCount()
— возвращает минимальное количество байтов, необходимых для хранения пикселей одного кадраgetAllocationByteCount()
— возвращает размер (в байтах) выделенной памяти, используемой для хранения пикселей данного GifDrawablegetInputSourceByteCount()
— возвращает длину (в байтах) исходных данныхtoString()
— возвращает человекочтебельную информацию о размере изображения и количестве кадров (предназначена для целей отладки)Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )