Фон
Я пытаюсь просмотреть растровые изображения анимированных файлов GIF и WEBP вручную (кадр за кадром), чтобы это работало не только для видов, но и для других случаев (например, для живых обоев).
Проблема
Анимированные файлы GIF / WEBP поддерживаются только из Android P с использованием ImageDecoder API (пример здесь ).
Для GIF я хотел попробовать Glide для этой задачи, но у меня не получилось, поэтому я попытался преодолеть это, используя библиотеку, которая позволяет их загружать ( здесь , решение здесь ). Я думаю, что это работает нормально.
Для WebP я подумал, что нашел другую библиотеку, которая могла бы работать на старых версиях Android ( здесь , сделанный форк здесь ), но кажется, что в некоторых случаях он не может хорошо обрабатывать файлы WebP (сообщается здесь ). Я пытался выяснить, в чем проблема и как ее решить, но мне не удалось.
Итак, предполагая, что когда-нибудь Google будет поддерживать анимацию GIF & WEBP для более старых версий Android через библиотеку поддержки (они написали здесь ), я решил попробовать использовать ImageDecoder для задания.
Дело в том, что, глядя на весь API ImageDecoder, он весьма ограничен в том, как мы должны его использовать. Я не понимаю, как я могу преодолеть его ограничения.
Что я нашел
Вот как ImageDecoder можно использовать для отображения анимированного WebP в ImageView (конечно, доступен только образец здесь ):
class MainActivity : AppCompatActivity() {
@SuppressLint("StaticFieldLeak")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val source = ImageDecoder.createSource(resources, R.raw.test)
object : AsyncTask<Void, Void, Drawable?>() {
override fun doInBackground(vararg params: Void?): Drawable? {
return try {
ImageDecoder.decodeDrawable(source)
} catch (e: Exception) {
null
}
}
override fun onPostExecute(result: Drawable?) {
super.onPostExecute(result)
imageView.setImageDrawable(result)
if (result is AnimatedImageDrawable) {
result.start()
}
}
}.execute()
}
}
Я пытался прочитать все документы ImageDecoder и AnimatedImageDrawable , а также посмотреть на его код, но Я не понимаю, как можно вручную проходить через каждый кадр и иметь время между ними.
Вопросы
Есть ли способ использовать API ImageDecoder для обхода каждого кадра вручную, получения растрового изображения и определения количества времени, которое необходимо для ожидания между кадрами? Есть ли обходной путь? Может быть, даже используя AnimatedImageDrawable?
Я бы хотел сделать то же самое на старых версиях Android. Является ли это возможным? Если так, то как? Может быть, на другом API / библиотеке? Google написал, что он работает над способом использования ImageDecoder в старых версиях Android, но я не вижу, чтобы он упоминался нигде (за исключением ссылки, которую я предоставил). Вероятно, еще не готов ... Android P даже не достигла 0,1% пользователей ... Может быть, Fresco может это сделать? Я тоже пытался проверить это там, но я не вижу, что он тоже способен на такое, и это огромная библиотека, которую можно использовать только для этой задачи, поэтому я бы предпочел использовать другую библиотеку вместо этого ... Я также знаю, что libwebp доступен, но он на C / C ++ и не уверен, подходит ли он для Android, и есть ли для него порт на Java / Kotlin для Android.
EDIT:
Поскольку я думаю, что получил то, что хотел, как для сторонней библиотеки, так и для ImageDecoder, чтобы иметь возможность получать растровые изображения из анимированного WebP, я все же хотел бы знать, как получить количество кадров и текущий кадр, используя ImageDecoder, если это возможно. Я попытался использовать ImageDecoder.decodeDrawable(source, object : ImageDecoder.OnHeaderDecodedListener...
, но он не предоставляет информацию о количестве кадров, и в API нет способа, чтобы я мог видеть, что я могу перейти к определенному индексу кадра и начать с него, или узнать для определенного кадра как долго нужно переходить к следующему кадру. Поэтому я сделал запрос о тех здесь .
К сожалению, я также не смог обнаружить, что Google имеет ImageDecoder, доступный для более старых версий Android.
Интересно также, если есть какой-то способ сделать то же самое, что и я, для относительно нового файла анимации HEIC. В настоящее время поддерживается только на Android P.