2013-02-22 3 views
16

Вот код XML:Как анимация изображений .gif в андроиде?

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

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

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

+0

См: https://github.com/koral--/android-gif-drawable – kenorb

ответ

14

Я бы не рекомендовал использовать 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 на отдельные образы перед использованием этого раствора.

+2

бы это не требуется нарезка GIF заранее? – Gjordis

+1

Да, я предполагаю, что это возможно для него. – Piotr

+0

В этом случае это определенно лучший подход. Но когда, например, загрузите gif и покажите это. Это может быть проблемой. – Gjordis

34

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

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

  2. Создать 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> 
    
  3. В файле макета xml, внутри которого вы хотите показать анимацию:

    //... 
    <ImageView 
        android:id="@+id/iv_animation" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_centerHorizontal="true" 
        android:contentDescription="Animation" /> 
    //... 
    
  4. В файле 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. Надеюсь, это поможет кому-то.

+1

Это полное и правильное решение. Thx – Sonhja

+0

Я не знаю, почему автор этого не принял. Благодарю вас за это решение. – gedo

+0

Отличный ответ, но одно предложение: вам не нужно публиковать его как новый Runnable(), потому что после этого вы не можете получить доступ к объекту frameAnimation, например. для остановки анимации. См. Пример кода Google http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html –

0

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

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

или я могу я дать вам tutorial для этого материала

0

Неправильная практика использования 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) { 
    } 
}); 

Пример показан here

4

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

GifDrawable gifFromResource = new GifDrawable(getResources(), R.drawable.anim); 
Смежные вопросы