Как анимация изображений .gif в Android?

Вот код для xml:

<ImageView
    android:id="@+id/imageView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/minepic" />

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

Есть ли какое-либо решение о том, как анимировать изображения .gif в приложении Android?

Ответы

Ответ 1

Чтобы дать точный и полный ответ, вот что вам нужно сделать шаг за шагом:

  • Вам нужно будет иметь разные .png изображения, которые будут действовать как кадры для вашей анимации. Сохраните их в папке res/drawable.

  • Создайте anim.xml файл в папке res/drawable со следующим содержимым:

    <?xml version="1.0" encoding="utf-8"?>
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android" 
        android:oneshot="false">
    
        <item android:drawable="@drawable/image_3" android:duration="250" />
        <item android:drawable="@drawable/image_2" android:duration="250" />
        <item android:drawable="@drawable/image_1" android:duration="250" />
        <item android:drawable="@drawable/image" android:duration="250" />
    
    </animation-list>
    
  • В макете xml, внутри которого вы хотите показать анимацию:

    //...
    <ImageView
         android:id="@+id/iv_animation"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_centerHorizontal="true"
         android:contentDescription="Animation" />
    //...
    
  • В файле Java, который загружает XML файл макета и вызовы setContentView:

    //...
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        final ImageView animImageView = (ImageView) findViewById(R.id.iv_animation);
        animImageView.setBackgroundResource(R.drawable.anim);
        animImageView.post(new Runnable() {
            @Override
            public void run() {
                AnimationDrawable frameAnimation =
                    (AnimationDrawable) animImageView.getBackground();
                frameAnimation.start();
            }
        });
        // ... other code ... 
    }
    // ...
    

Чтобы остановить анимацию, вы можете вызвать .stop() на AnimationDrawable. Дополнительные сведения о доступных методах см. В документации AnimationDrawable. Надеюсь, это поможет кому-то.

Ответ 2

Я бы не рекомендовал использовать классы Movie или WebView, но ImageView вместо этого с исходным чертежом, установленным на animation-list. Посмотрите пример (mydrawable.xml):

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/image_1" android:duration="100" />
<item android:drawable="@drawable/image_2" android:duration="100" />
<item android:drawable="@drawable/image_3" android:duration="100" />
</animation-list> 

// in your layout : <ImageView
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:src="@drawable/my_drawable" />

Очевидно, что перед использованием этого решения вы должны нарезать свой .gif на отдельные изображения.

Ответ 3

Насколько я понимаю, ваш GIF-образ не перемещается, так что поведение нативного Android, если вы рассматриваете GIF как статическое изображение. Для меня лучшим решением (не изобретать колесо!) Была библиотека с открытым исходным кодом gitDrawable. Проверьте их README, все очень просто: добавьте зависимость от gradle и используйте (в XML или коде). Пример использования в Java:

GifDrawable gifFromResource = new GifDrawable( getResources(), R.drawable.anim );

Ответ 5

Ну, мне удалось анимировать изображения андроида с помощью этого простого кода:

canvas.drawColor(Color.WHITE);
super.onDraw(canvas);


long now=android.os.SystemClock.uptimeMillis();
System.out.println("now="+now);
if (moviestart == 0) { // first time
moviestart = now;

}

System.out.println("\tmoviestart="+moviestart);
int relTime = (int)((now - moviestart) % movie.duration()) ;
 System.out.println("time="+relTime+"\treltime="+movie.duration());
movie.setTime(relTime);
movie.draw(canvas,this.getWidth()/2-20,this.getHeight()/2-40);
this.invalidate();
 }


это было легко реализовано с помощью movieview

или я могу дать вам учебник для этого материала

Ответ 6

Неправильная практика использования Threads (т.е. View.post(new Runnable)), потому что представление могло измениться за время, когда чертеж будет окрашен (в одном случае используется анимированное изображение в ListView с элементами, содержащими разные фоновые изображения), которые могут вызвать ClassCastException, если ImageView, к моменту запуска потока, имеет фон, который не является анимированным ресурсом.

ImageView loadingImg = (ImageView)v.findViewById(R.id.image);
loadingImg.setBackgroundResource(R.drawable.progressdialog);
loadingImg.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
  @Override
  public void onViewAttachedToWindow(View v) {
    AnimationDrawable loadingAnimation = (AnimationDrawable) v.getBackground();
    loadingAnimation.start();
  }

  @Override
  public void onViewDetachedFromWindow(View v) {
  }
});

Пример показан здесь