Playing an animated GIF image file in imageview

后端 未结 3 2148
既然无缘
既然无缘 2021-02-15 15:51

I am making an Android application, in which I want to play a GIF file in an imageview. I have a tried a lot of ways, made a custom class but haven\'t succeeded.

Has an

3条回答
  •  北恋
    北恋 (楼主)
    2021-02-15 16:38

    You can find sample code in the Android SDK samples. The gif image is displayed in activity that extends View

    The code to use gif image other than ImageView is

    import android.app.Activity;
    import android.content.Context;
    import android.graphics.*;
    import android.graphics.drawable.*;
    import android.os.Bundle;
    import android.view.KeyEvent;
    import android.view.*;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.ByteArrayOutputStream;
    
    public class BitmapDecode extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(new SampleView(this));
        }
    
        private static class SampleView extends View {
            private Bitmap mBitmap;
            private Bitmap mBitmap2;
            private Bitmap mBitmap3;
            private Bitmap mBitmap4;
            private Drawable mDrawable;
    
            private Movie mMovie;
            private long mMovieStart;
    
            private static 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();
            }
    
            public SampleView(Context context) {
                super(context);
                setFocusable(true);
    
                java.io.InputStream is;
                is = context.getResources().openRawResource(R.drawable.beach);
    
                BitmapFactory.Options opts = new BitmapFactory.Options();
                Bitmap bm;
    
                opts.inJustDecodeBounds = true;
                bm = BitmapFactory.decodeStream(is, null, opts);
    
                // now opts.outWidth and opts.outHeight are the dimension of the
                // bitmap, even though bm is null
    
                opts.inJustDecodeBounds = false;    // this will request the bm
                opts.inSampleSize = 4;             // scaled down by 4
                bm = BitmapFactory.decodeStream(is, null, opts);
    
                mBitmap = bm;
    
                // decode an image with transparency
                is = context.getResources().openRawResource(R.drawable.frog);
                mBitmap2 = BitmapFactory.decodeStream(is);
    
                // create a deep copy of it using getPixels() into different configs
                int w = mBitmap2.getWidth();
                int h = mBitmap2.getHeight();
                int[] pixels = new int[w*h];
                mBitmap2.getPixels(pixels, 0, w, 0, 0, w, h);
                mBitmap3 = Bitmap.createBitmap(pixels, 0, w, w, h,
                                               Bitmap.Config.ARGB_8888);
                mBitmap4 = Bitmap.createBitmap(pixels, 0, w, w, h,
                                               Bitmap.Config.ARGB_4444);
    
                mDrawable = context.getResources().getDrawable(R.drawable.button);
                mDrawable.setBounds(150, 20, 300, 100);
    
                is = context.getResources().openRawResource(R.drawable.animated_gif);
                if (true) {
                    mMovie = Movie.decodeStream(is);
                } else {
                    byte[] array = streamToBytes(is);
                    mMovie = Movie.decodeByteArray(array, 0, array.length);
                }
            }
    
            @Override protected void onDraw(Canvas canvas) {
                canvas.drawColor(0xFFCCCCCC);            
    
                Paint p = new Paint();
                p.setAntiAlias(true);
    
                canvas.drawBitmap(mBitmap, 10, 10, null);
                canvas.drawBitmap(mBitmap2, 10, 170, null);
                canvas.drawBitmap(mBitmap3, 110, 170, null);
                canvas.drawBitmap(mBitmap4, 210, 170, null);
    
                mDrawable.draw(canvas);
    
                long now = android.os.SystemClock.uptimeMillis();
                if (mMovieStart == 0) {   // first time
                    mMovieStart = now;
                }
                if (mMovie != null) {
                    int dur = mMovie.duration();
                    if (dur == 0) {
                        dur = 1000;
                    }
                    int relTime = (int)((now - mMovieStart) % dur);
                    mMovie.setTime(relTime);
                    mMovie.draw(canvas, getWidth() - mMovie.width(),
                                getHeight() - mMovie.height());
                    invalidate();
                }
            }
        }
    }
    

    You can use these links as well

    http://weavora.com/blog/2012/02/07/android-how-to-use-animated-gif/

    http://droid-blog.net/2011/10/14/tutorial-how-to-use-animated-gifs-in-android-part-1/

提交回复
热议问题