Как анимация изображений .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 );
Ответ 4
And i think this is the one way of solution by writing the anim-space.xml
In which the slices of the image are added to the items one by one and setting that xml to the imageview of our layout xml.
http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html
В этой ссылке разработчиков это четко определено.
Ответ 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) {
}
});
Пример показан здесь