Java 关于Android电影类的信息

Java 关于Android电影类的信息,java,android,image,animation,Java,Android,Image,Animation,我正在尝试显示动画gif。顺便说一句,我是和全班同学一起做的。但是Android开发者页面不提供关于这些方法的信息 如何调整gif的大小以适应布局 提前感谢我一直在尝试用这个方法做同样的事情(显示动画GIF) 仅当您指定使用sdk android:minSdkVersion=“3”时,它才起作用 用于缩放 package com.example.GIFShow; import android.content.Context; import android.graphics.Bitmap; im

我正在尝试显示动画gif。顺便说一句,我是和全班同学一起做的。但是Android开发者页面不提供关于这些方法的信息

如何调整gif的大小以适应布局


提前感谢

我一直在尝试用这个方法做同样的事情(显示动画GIF)

仅当您指定使用sdk android:minSdkVersion=“3”时,它才起作用

用于缩放

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

}
现在您可以通过以下两种方式之一获取电影对象并将其传递给类

从project drawable文件夹获取输入GIF电影对象

    Movie movie = Movie.decodeStream
        (context.getResources().openRawResource(R.drawable.somefile));
或从外部存储器获取输入GIF电影对象 (/mnt/sdcard…/mnt/extSdCard…等)

现在将移动的GIF图像/电影对象设置到活动视图中:

    View view = new MYGIFView(this, movie);
    setContentView(view);
如果从外部存储器获取GIF图像/电影对象(第二个示例),则需要支持例程:

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

我知道,这是一个很老的帖子

但是你可以试试这个

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

    if (mMovie != null) {
        int movieWidth = mMovie.width();
        int movieHeight = mMovie.height();


         /** Calculate horizontal scaling*/

        float scaleH = 1f;
        int measureModeWidth = MeasureSpec.getMode(widthMeasureSpec);

        if (measureModeWidth != MeasureSpec.UNSPECIFIED) {
            int maximumWidth = MeasureSpec.getSize(widthMeasureSpec);
            if (movieWidth > maximumWidth) {
                scaleH = (float) movieWidth / (float) maximumWidth;
            }else{
                scaleH = (float) maximumWidth / (float) movieWidth;
            }
        }


         /** calculate vertical scaling*/

        float scaleW = 1f;
        int measureModeHeight = MeasureSpec.getMode(heightMeasureSpec);

        if (measureModeHeight != MeasureSpec.UNSPECIFIED) {
            int maximumHeight = MeasureSpec.getSize(heightMeasureSpec);
            if (movieHeight > maximumHeight) {
                scaleW = (float) movieHeight / (float) maximumHeight;
            }else{
                scaleW = (float) maximumHeight / (float) movieHeight;
            }
        }


         /** calculate overall scale*/

        mScale = Math.max(scaleH, scaleW);

        mMeasuredMovieWidth = (int) (movieWidth * mScale);
        mMeasuredMovieHeight = (int) (movieHeight * mScale);

        setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);

    } else {

         /*No movie set, just set minimum available size.*/

        setMeasuredDimension(getSuggestedMinimumWidth(), getSuggestedMinimumHeight());
    }
}

private void drawMovieFrame(Canvas canvas) {

    mMovie.setTime(mCurrentAnimationTime);

    canvas.save(Canvas.MATRIX_SAVE_FLAG);
    canvas.scale(mScale, mScale);
            mLeft = (getWidth() - mMeasuredMovieWidth) / 2f;
    mTop = (getHeight() - mMeasuredMovieHeight) / 2f;
    mMovie.draw(canvas, mLeft / mScale, mTop / mScale);
    canvas.restore();
}

它也可以用于视频文件,还是仅用于GIF?玩它有效率吗?
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

    if (mMovie != null) {
        int movieWidth = mMovie.width();
        int movieHeight = mMovie.height();


         /** Calculate horizontal scaling*/

        float scaleH = 1f;
        int measureModeWidth = MeasureSpec.getMode(widthMeasureSpec);

        if (measureModeWidth != MeasureSpec.UNSPECIFIED) {
            int maximumWidth = MeasureSpec.getSize(widthMeasureSpec);
            if (movieWidth > maximumWidth) {
                scaleH = (float) movieWidth / (float) maximumWidth;
            }else{
                scaleH = (float) maximumWidth / (float) movieWidth;
            }
        }


         /** calculate vertical scaling*/

        float scaleW = 1f;
        int measureModeHeight = MeasureSpec.getMode(heightMeasureSpec);

        if (measureModeHeight != MeasureSpec.UNSPECIFIED) {
            int maximumHeight = MeasureSpec.getSize(heightMeasureSpec);
            if (movieHeight > maximumHeight) {
                scaleW = (float) movieHeight / (float) maximumHeight;
            }else{
                scaleW = (float) maximumHeight / (float) movieHeight;
            }
        }


         /** calculate overall scale*/

        mScale = Math.max(scaleH, scaleW);

        mMeasuredMovieWidth = (int) (movieWidth * mScale);
        mMeasuredMovieHeight = (int) (movieHeight * mScale);

        setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);

    } else {

         /*No movie set, just set minimum available size.*/

        setMeasuredDimension(getSuggestedMinimumWidth(), getSuggestedMinimumHeight());
    }
}

private void drawMovieFrame(Canvas canvas) {

    mMovie.setTime(mCurrentAnimationTime);

    canvas.save(Canvas.MATRIX_SAVE_FLAG);
    canvas.scale(mScale, mScale);
            mLeft = (getWidth() - mMeasuredMovieWidth) / 2f;
    mTop = (getHeight() - mMeasuredMovieHeight) / 2f;
    mMovie.draw(canvas, mLeft / mScale, mTop / mScale);
    canvas.restore();
}
You answer is good. It helped me alot.I have changed one thing for performance .Moved the bitmap creation to outside of ondraw

import java.io.InputStream;

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

public class GifView extends View {

    private Movie mMovie;
    InputStream mStream;
    long mMoviestart;
    private Context context;

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

        this.context = context;
        init();
    }

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

    public GifView(Context context) {
        super(context);
        this.context = context;
        init();
    }

    Bitmap movieBitmap  = null;

    private void init() {

        InputStream object = this.getResources().openRawResource(
                R.raw.postloadinganimation);
        mMovie = Movie.decodeStream(object);// context.getResources().getAssets().open("PostLoadingAnimation.gif"));

        movieBitmap = Bitmap.createBitmap(mMovie.width(),
                mMovie.height(), Bitmap.Config.ARGB_8888);      
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.TRANSPARENT);

        super.onDraw(canvas);
        final long now = SystemClock.uptimeMillis();

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

        final int relTime = (int) ((now - mMoviestart) % mMovie.duration());
        mMovie.setTime(relTime);
        // mMovie.draw(canvas, 0, 0);

        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());
        canvas.drawBitmap(movieBitmap, src, dst, null);

        this.invalidate();
    }


}