Показать анимированный GIF - PullRequest
       38

Показать анимированный GIF

245 голосов
/ 07 сентября 2010

Я хочу отображать анимированные GIF-изображения в моей заявке. Как я выяснил, сложный способ, которым Android не поддерживает анимированный GIF изначально.

Однако он может отображать анимацию, используя AnimationDrawable :

Разработка> Руководства> Изображения и графика> Обзор чертежей

В примере используется анимация, сохраненная в виде кадров в ресурсах приложения, но мне нужно для непосредственного отображения анимированного GIF.

Мой план состоит в том, чтобы разбить анимированный GIF на кадры и добавить каждый кадр как нарисованный в AnimationDrawable.

Кто-нибудь знает, как извлечь кадры из анимированного GIF и преобразовать каждый из них в Drawable ?

Ответы [ 29 ]

185 голосов
/ 14 октября 2011

Android фактически может декодировать и отображать анимированные GIF-файлы, используя класс android.graphics.Movie.

Это не слишком документировано, но в SDK Reference .Более того, он используется в Сэмплах в ApiDemos в примере BitmapDecode с некоторым анимированным флагом.

52 голосов
/ 26 июля 2015

ОБНОВЛЕНИЕ:

Использование скольжения:

dependencies {
  implementation 'com.github.bumptech.glide:glide:4.0.0'
}

Использование:

Glide.with(context).load(GIF_URI).into(new GlideDrawableImageViewTarget(IMAGE_VIEW));

см. документы

28 голосов
/ 16 мая 2015

также поместите (main / assets / htmls / name.gif) [с этим html-кодом подгоните к размеру]

<html style="margin: 0;">
<body style="margin: 0;">
<img src="name.gif" style="width: 100%; height: 100%" />
</body>
</html>

объявите в своем Xml, например, вот так (main / res / layout / name.xml): [вы определяете размер, например]

<WebView
android:layout_width="70dp"
android:layout_height="70dp"
android:id="@+id/webView"
android:layout_gravity="center_horizontal" />

в вашей активности поместите следующий код внутри onCreate

web = (WebView) findViewById(R.id.webView); 
web.setBackgroundColor(Color.TRANSPARENT); //for gif without background
web.loadUrl("file:///android_asset/htmls/name.html");

если вы хотите загружать динамически, вы должны загрузить веб-представление с данными:

// or "[path]/name.gif" (e.g: file:///android_asset/name.gif for resources in asset folder), and in loadDataWithBaseURL(), you don't need to set base URL, on the other hand, it's similar to loadData() method.
String gifName = "name.gif";
String yourData = "<html style=\"margin: 0;\">\n" +
        "    <body style=\"margin: 0;\">\n" +
        "    <img src=" + gifName + " style=\"width: 100%; height: 100%\" />\n" +
        "    </body>\n" +
        "    </html>";
// Important to add this attribute to webView to get resource from outside.
webView.getSettings().setAllowFileAccess(true);

// Notice: should use loadDataWithBaseURL. BaseUrl could be the base url such as the path to asset folder, or SDCard or any other path, where your images or the other media resides related to your html
webView.loadDataWithBaseURL("file:///android_asset/", yourData, "text/html", "utf-8", null);
// Or if you want to load image from SD card or where else, here is the idea.
String base = Environment.getExternalStorageDirectory().getAbsolutePath().toString();
webView.loadDataWithBaseURL(base + '/', yourData, "text/html", "utf-8", null);

предложение: лучше загрузить gif со статическими изображениями для проверки дополнительной информации https://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html

Вот и все, надеюсь, вы поможете.

21 голосов
/ 01 октября 2010

Я решил проблему, разделив анимации gif на кадры перед сохранением их на телефоне, поэтому мне не пришлось бы иметь дело с этим в Android.

Затем я загружал каждый кадр на телефонсоздать Drawable из него, а затем создать AnimationDrawable - очень похоже на пример из моего вопроса

16 голосов
/ 16 октября 2011

я нашел очень простой способ, с хорошим и простым рабочим примером здесь

отображение анимированного виджета

Прежде чем заставить его работать, в коде необходимо выполнить некоторые действия

В СЛЕДУЮЩЕМ

    @Override
    public void onCreate(Bundle savedInstanceState){    
        super.onCreate(savedInstanceStated);   
        setContentView(new MYGIFView());
    }    
}

просто заменить

setContentView(new MYGIFView());

в

setContentView(new MYGIFView(this));

И IN

public GIFView(Context context) {
    super(context);

Предоставьте свой собственный файл анимации GIF

    is = context.getResources().openRawResource(R.drawable.earth);
    movie = Movie.decodeStream(is);
}

ЗАМЕНА ПЕРВОЙ ЛИНИИ В

public MYGIFView(Context context) {

по названию класса ...

после внесения этих небольших изменений все должно работать как у меня ...

надеюсь, это поможет

10 голосов
/ 10 января 2015

Способы отображения анимированного GIF на Android:

  • Класс фильма.Как уже упоминалось выше, он довольно глючный.
  • WebView.Он очень прост в использовании и обычно работает.Но иногда это начинает плохо себя вести, и это всегда на некоторых неясных устройствах, которых у вас нет.Кроме того, вы не можете использовать несколько экземпляров в любом виде списка, потому что это влияет на вашу память.Тем не менее, вы можете рассматривать это как основной подход.
  • Пользовательский код для декодирования GIF-файлов в растровые изображения и отображения их как Drawable или ImageView.Я упомяну две библиотеки:

https://github.com/koral--/android-gif-drawable - декодер реализован на C, поэтому он очень эффективен.

https://code.google.com/p/giffiledecoder - декодер реализован на Java, поэтому с ним проще работать.Все еще достаточно эффективный, даже с большими файлами.

Вы также найдете много библиотек, основанных на классе GifDecoder.Это также Java-декодер, но он работает, загружая весь файл в память, поэтому он применим только к маленьким файлам.

9 голосов
/ 28 июня 2015

Мне было очень тяжело, чтобы анимированный GIF работал в Android. У меня было только две следующие работы:

  1. WebView
  2. Ion

WebView работает нормально и действительно просто, но проблема в том, что он замедляет загрузку представления, и приложение не отвечает на секунду или около того. Мне это не понравилось. Поэтому я пробовал разные подходы (НЕ РАБОТАЛ):

  1. ImageViewEx устарело!
  2. Пикассо не загружен анимированный GIF
  3. android-gif-drawable выглядит великолепно, но это вызвало некоторые проблемы с проводным NDK в моем проекте. Это привело к тому, что моя локальная библиотека NDK перестала работать, и я не смог это исправить

У меня было немного взад и вперед с Ion; Наконец, у меня это работает, и это действительно быстро: -)

Ion.with(imgView)
  .error(R.drawable.default_image)
  .animateGif(AnimateGifMode.ANIMATE)
  .load("file:///android_asset/animated.gif");
8 голосов
/ 12 февраля 2016

Glide

Библиотека загрузчика изображений для Android, рекомендованная Google.

  • Glide очень похож на Picasso, но намного быстрее, чем Picasso.
  • Glide потребляет меньше памяти, чем Picasso.

То, что есть у Glide, но отсутствует у Picasso

Возможность загрузки GIF-анимациипростой ImageView может быть самой интересной особенностью Glide.И да, вы не можете сделать это с Пикассо.enter image description here Некоторые важные ссылки -

  1. https://github.com/bumptech/glide
  2. http://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en
7 голосов
/ 14 августа 2013

Используйте ImageViewEx , библиотеку, которая делает использование GIF столь же простым, как ImageView

6 голосов
/ 02 декабря 2014

Никто не упомянул библиотеку Ion или Glide . они работают очень хорошо.

С ним проще работать, чем с WebView.

...