Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Info about the Movie class for Android

I'm trying to show an animated gif. By the way I'm doing it with the class Movie. But the Android Developer page dont grant info about the methods.

How can I make the gif to be resized to fit the layout?

Thanks in advance

like image 578
Addev Avatar asked Sep 10 '11 18:09

Addev


1 Answers

I've been trying to do the same thing (to display animated GIF) using this method.

It works only if you specify uses-sdk android:minSdkVersion="3"

For scaling ...

package com.example.GIFShow;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Movie;
import android.graphics.Rect;
import android.util.Log;
import android.view.View;


class MYGIFView extends View {

private static final boolean twigDebug = true;

private Movie mMovie;
private long mMovieStart;

MYGIFView(Context aContext, Movie aMovie) {
    super(aContext);

    if (aMovie == null)
        return;

    mMovie = aMovie;
    mMovieStart = android.os.SystemClock.uptimeMillis();
}

protected void onDraw(Canvas aCanvas) {
    super.onDraw(aCanvas);

    if (mMovie == null || mMovie.duration() == 0)
        return;

    int relTime = (int)((android.os.SystemClock.uptimeMillis() - mMovieStart)
                        % mMovie.duration());
    mMovie.setTime(relTime);

    Bitmap movieBitmap = Bitmap.createBitmap(mMovie.width(), mMovie.height(),
                                             Bitmap.Config.ARGB_8888);
    Canvas movieCanvas = new Canvas(movieBitmap);
    mMovie.draw(movieCanvas, 0, 0);

    Rect src = new Rect(0, 0, mMovie.width(), mMovie.height());
    Rect dst = new Rect(0, 0, this.getWidth(), this.getHeight());
    aCanvas.drawBitmap(movieBitmap, src, dst, null);

    this.invalidate();
}

}

Now you can get and pass a Movie object to the class in one of two ways ...

Get input GIF Movie object from project drawable folder

    Movie movie = Movie.decodeStream
        (context.getResources().openRawResource(R.drawable.somefile));

Or get input GIF Movie object from external storage (/mnt/sdcard ... /mnt/extSdCard ... etc)

    Movie movie = null;
    try {
        FileInputStream stream =
        new FileInputStream(Environment.getExternalStorageDirectory() +
                            "/somefolder/somefile.gif");
        try {
            byte[] byteStream = streamToBytes(stream);
            movie = Movie.decodeByteArray(byteStream, 0, byteStream.length);
        }
        finally {
            stream.close();
        }
    }
    catch (IOException e) { }

Now set the moving GIF image / Movie object into your activity view:

    View view = new MYGIFView(this, movie);
    setContentView(view);

If you get the GIF image / Movie object from external storage (second example) you'll need the supporting routine:

private byte[] streamToBytes(InputStream is) {

    ByteArrayOutputStream os = new ByteArrayOutputStream(1024);
    byte[] buffer = new byte[1024];

    int len;
    try {
        while ((len = is.read(buffer)) >= 0)
            os.write(buffer, 0, len);
    }
    catch (java.io.IOException e) { }

    return os.toByteArray();
}
like image 112
capella Avatar answered Sep 22 '22 02:09

capella