【问题标题】:Info about the Movie class for Android有关 Android 电影类的信息
【发布时间】:2015-08-13 19:39:30
【问题描述】:

我正在尝试显示动画 gif。顺便说一句,我正在使用Movie 课程。但 Android 开发者页面不授予有关方法的信息。

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

提前致谢

【问题讨论】:

    标签: java android image animation


    【解决方案1】:

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

    只有指定 uses-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();
    }
    
    }
    

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

    从项目可绘制文件夹中获取输入的 GIF 电影对象

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

    或者从外部存储中获取输入的 GIF 电影对象 (/mnt/sdcard ... /mnt/extSdCard ...等)

        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) { }
    

    现在将移动的 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();
    }
    

    【讨论】:

    • 它也可以用于视频文件,还是只能用于 GIF 文件?玩起来有效率吗?
    【解决方案2】:
    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();
        }
    
    
    }
    

    【讨论】:

      【解决方案3】:

      我知道,这是很老的帖子了。

      但是你可以试试这个……

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

      【讨论】:

        猜你喜欢
        • 2012-02-04
        • 2010-12-20
        • 1970-01-01
        • 2015-08-13
        • 1970-01-01
        • 2019-03-06
        • 1970-01-01
        • 2012-06-20
        • 1970-01-01
        相关资源
        最近更新 更多