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! :)
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>