2015-12-11 4 views
2

J'utilise la classe ci-dessous. Comment puis-je arrêter et démarrer la boucle en fonction des événements de clic? J'ai essayé de supprimer invalidate(), mais Gif ne démarre pas du tout.Comment arrêter l'animation gif dans Android?

classe GifView

import java.io.InputStream; 

import com.example.merchant.R; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Movie; 
import android.os.SystemClock; 
import android.util.AttributeSet; 
import android.view.View; 

public class GifView extends View{ 

private InputStream gifInputStream; 
private Movie gifMovie; 
private int movieWidth, movieHeight; 
private long movieDuration; 
private long movieStart; 

public GifView(Context context) { 
    super(context); 
    init(context); 
} 


public GifView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(context); 
} 

public GifView(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
    init(context); 
} 

private void init(Context context) { 
    setFocusable(true); 
    gifInputStream = context.getResources().openRawResource(R.drawable.ani_bart); 

    gifMovie = Movie.decodeStream(gifInputStream); 
    movieWidth = gifMovie.width(); 
    movieHeight = gifMovie.height(); 
    movieDuration = gifMovie.duration(); 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    setMeasuredDimension(movieWidth, movieHeight); 
} 

public int getMovieWidth() { 
    return movieWidth; 
} 

public int getMovieHeight() { 
    return movieHeight; 
} 

public long getMovieDuration() { 
    return movieDuration; 
} 

@Override 
protected void onDraw(Canvas canvas) { 

    long now = SystemClock.uptimeMillis(); 

    if(movieStart == 0) { 
     movieStart = now; 
    } 

    if(gifMovie != null) { 

     int dur = gifMovie.duration(); 
     if(dur == 0) { 
      dur = 1000; 
     } 

     int relTime = (int)((now - movieStart) % dur); 

     gifMovie.setTime(relTime); 

     gifMovie.draw(canvas, 0, 0); 
     invalidate(); 
    } 
} 

}

+0

Ajouter un 'boolean' champ à la classe - par exemple,' isPlaying private boolean; '- vérifier la première chose' onDraw() 'et' revenir, 'si c'est' false'. Créez des méthodes publiques pour démarrer et arrêter, en définissant le champ de manière appropriée dans chacune d'elles, puis appelez 'invalidate()' à la fin de la méthode de démarrage. –

+0

Pouvez-vous me dire le code que je devrais utiliser dans la méthode stop, quand je veux terminer l'animation? – Anirudh

+0

'isPlaying = false;' –

Répondre

0

Je suppose qu'il est impossible
Mais si vous avez besoin de contrôler vous naviguent pouvez créer aniation de FRME dans Android via animation-list

1

C'est ce que je pour surmonter le problème. Pas vraiment sûr cependant si c'est une solution valide. J'ai travaillé pour moi.

@Override 
protected void onDraw(Canvas canvas) { 

    long now = android.os.SystemClock.uptimeMillis(); 
    if (mMovieStart == 0) { // first time 
     mMovieStart = now; 
    } 

    if (gifMovie != null) { 

     int dur = gifMovie.duration(); 
     if (dur == 0) { 
      dur = 1000; 
     } 
     now = android.os.SystemClock.uptimeMillis(); 
     int relTime = (int) ((now - mMovieStart) % dur); 
     if (now - mMovieStart > movieDuration) { 
      relTime = 0; 
     } 

     gifMovie.setTime(relTime); 

     gifMovie.draw(canvas, 0, 0); 
     invalidate(); 

    } 
}