androidgifmovie

Showing gif in android


i have this code to show gif image with Movie.

public class GIFView extends View{        
private Movie movie;  
private InputStream is;  
private long moviestart;  
public GIFView(Context context) {  
    super(context);
    is=getResources().openRawResource(R.drawable.anim_cerca);  
    movie=Movie.decodeStream(is);
}  

@Override  
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    long now=android.os.SystemClock.uptimeMillis();  

    if (moviestart == 0) 
        moviestart = now;  

    int relTime = (int)((now - moviestart) % movie.duration());
    movie.setTime(relTime);
    movie.draw(canvas,10,10);
    this.invalidate();
}                         

}

My problem borns when gif is loaded, it draw very bad, only the first frame is shown and the other are like disturbed. What can i do?

EDIT: THE PROBLEM IS EMULATOR! IT DOESN'T SHOW GIF, BUT ON DEVICE IT'S OK! :)


Solution

  • I solved in this way :

    public class GIFView extends View{        
        private Movie movie;    
        private long moviestart;  
        public GIFView(Context context) throws IOException {  
            super(context);
        movie=Movie.decodeStream(getResources().getAssets().open("anim_cerca.gif"));
        }
        public GIFView(Context context, AttributeSet attrs) throws IOException{
            super(context, attrs);
        movie=Movie.decodeStream(getResources().getAssets().open("anim_cerca.gif"));
        }
        public GIFView(Context context, AttributeSet attrs, int defStyle) throws IOException {
            super(context, attrs, defStyle);
            movie=Movie.decodeStream(getResources().getAssets().open("anim_cerca.gif"));
        }
    @Override  
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
        long now=android.os.SystemClock.uptimeMillis();
        Paint p = new Paint();
        p.setAntiAlias(true);
        if (moviestart == 0) 
                moviestart = now;
                int relTime;
                relTime = (int)((now - moviestart) % movie.duration());
                movie.setTime(relTime);
                movie.draw(canvas,0,0);
                this.invalidate();
           }                         
    }    
    

    and in layout i put this custom view in this way:

    <spazio.digitale.com.GIFView
            android:layout_marginLeft="30dp" android:layout_gravity="center"
            android:layout_width="wrap_content" android:layout_height="220dp"
            android:id="@+id/GIFSingle">
    </spazio.digitale.com.GIFView>