ti-enxame.com

Como animar imagens .gif em um android?

Aqui está o código para xml:

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

Aqui o minepic é uma imagem animada gif, mas depois de executar a aplicação é apenas mostrar uma imagem estática.

Existe alguma solução sobre como animar as imagens .gif no aplicativo Android?

16
Danny

Dar uma resposta precisa e completa aqui é o que você precisa fazer passo a passo:

  1. Você precisaria ter imagens .png diferentes que agiriam como quadros Para sua animação. Salve-os na pasta res/drawable.

  2. Crie o arquivo anim.xml na pasta res/drawable com o seguinte conteúdo:

    <?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. No arquivo xml do layout dentro do qual você deseja mostrar a animação:

    //...
    <ImageView
         Android:id="@+id/iv_animation"
         Android:layout_width="wrap_content"
         Android:layout_height="wrap_content"
         Android:layout_centerHorizontal="true"
         Android:contentDescription="Animation" />
    //...
    
  4. No arquivo Java que carrega o arquivo xml de layout e chama 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 ... 
    }
    // ...
    

Para interromper a animação, você pode chamar .stop() na AnimationDrawable. Para mais detalhes sobre os métodos disponíveis, você pode ver AnimationDrawable documentation. Espero que ajude alguém.

35
Shobhit Puri

Eu não recomendaria o uso de classes Movie ou WebView, mas ImageView em vez de um conjunto drawable de fonte para animation-list. Veja o exemplo (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" />

Obviamente, você precisa cortar seu .gif em imagens separadas antes de usar essa solução. 

14
Piotr

Tanto quanto eu entendo, sua imagem GIF não está se movendo, então esse é o comportamento nativo do Android se você tratar GIF como uma imagem estática. Para mim, a melhor solução (não reinventar a roda!) Era a biblioteca de código aberto gitDrawable . Verifique o seu README, tudo é muito simples: adicione dependência ao gradle e use (em XML ou código). Exemplo de uso em Java:

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

Bem, eu era capaz de animar imagens Android usando este código simples:

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();
 }


foi implementado facilmente usando movieview

ou eu posso te dar um tutorial para essas coisas

0
dondondon
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

Neste link desenvolvedores é definido claramente.

0
Danny

Não é uma boa prática usar Threads (ou seja, View.post (new Runnable)) porque a visualização pode ter mudado durante o tempo em que o drawable será pintado (um caso está usando a imagem animada no ListView com itens contendo diferentes imagens de fundo) , que pode causar um ClassCastException se o ImageView, no momento em que o segmento é executado, tem um plano de fundo que não é um recurso animado.

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) {
  }
});

Exemplo mostrado aqui

0
Carlos Barcellos