zoukankan      html  css  js  c++  java
  • Android实现GIF图片解码与播放

    Android实现GIF图片解码与播放

    如何在Android中播放GIF图片呢?如果直接按以前的方法,分解图片,可能相对比较麻烦。

    今天给大伙介绍一种新的方式,构造自己的Android图片解码帮助类,直接在Android解码GIF图片,还可以实现播放功能。

    下面先请看一GIF图:

     

     

    我们以此美图为示例,解码GIF。  

    先编写一个GIF解码的帮助类,该类提供了几个操作GIF图片的方法,比如图片的初始化呀,切换图片呀,获得整个GIF的组合数量等等,由于代码量太多,这里就不列出来,后面会提供源码供大家参考,可于源码内找到该帮助类。

     

    之后,编写一个用于可显示Gif 的组件,继承自View 并实现了Runable,代码如下:

     

    package com.terry.gif;

    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.Bitmap;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.util.AttributeSet;
    import android.view.View;

    public class TypegifView extends View implements Runnable {
        gifOpenHelper gHelper;
        private boolean isStop = true;
        int delta;
        String title;

        Bitmap bmp;

        // construct - refer for java
        public TypegifView(Context context) {
            this(context, null);

        }

        // construct - refer for xml
        public TypegifView(Context context, AttributeSet attrs) {
            super(context, attrs);
    //添加属性
            TypedArray ta = context.obtainStyledAttributes(attrs,
                    R.styleable.gifView);
            int n = ta.getIndexCount();

            for (int i = 0; i < n; i++) {
                int attr = ta.getIndex(i);

                switch (attr) {
                case R.styleable.gifView_src:
                    int id = ta.getResourceId(R.styleable.gifView_src, 0);
                    setSrc(id);
                    break;

                case R.styleable.gifView_delay:
                    int idelta = ta.getInteger(R.styleable.gifView_delay, 1);
                    setDelta(idelta);
                    break;

                case R.styleable.gifView_stop:
                    boolean sp = ta.getBoolean(R.styleable.gifView_stop, false);
                    if (!sp) {
                        setStop();
                    }
                    break;
                }

            }

            ta.recycle();
        }

        /**
         * 设置停止
         * 
         * @param stop
         */
        public void setStop() {
            isStop = false;
        }

        /**
         * 设置启动
         */
        public void setStart() {
            isStop = true;

            Thread updateTimer = new Thread(this);
            updateTimer.start();
        }

        /**
         * 通过下票设置第几张图片显示
         * @param id
         */
        public void setSrc(int id) {

            gHelper = new gifOpenHelper();
            gHelper.read(TypegifView.this.getResources().openRawResource(id));
            bmp = gHelper.getImage();// 得到第一张图片
        }

        public void setDelta(int is) {
            delta = is;
        }

        // to meaure its Width & Height
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            setMeasuredDimension(measureWidth(widthMeasureSpec),
                    measureHeight(heightMeasureSpec));
        }

        private int measureWidth(int measureSpec) {
            return gHelper.getWidth();
        }

        private int measureHeight(int measureSpec) {
            return gHelper.getHeigh();
        }

        protected void onDraw(Canvas canvas) {
            // TODO Auto-generated method stub
            canvas.drawBitmap(bmp, 0, 0, new Paint());
            bmp = gHelper.nextBitmap();

        }

        public void run() {
            // TODO Auto-generated method stub
            while (isStop) {
                try {
                    this.postInvalidate();
                    Thread.sleep(gHelper.nextDelay() / delta);
                } catch (Exception ex) {

                }
            }
        }

    }

     

    基础功能实现后。可通过view.start()开启GIF的播放,或者view.stop()停止GIF的播放,代码如下:

     

    setContentView(R.layout.main);
            Button btn = (Button) findViewById(R.id.Button01);
            Button btn2 = (Button) findViewById(R.id.Button02);
            final TypegifView view = (TypegifView) findViewById(R.id.gifView1);

            btn.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    view.setStop();
                }
            });

            btn2.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    view.setStart();
                }
            });

     

    显示效果:

    源码下载:gifPlayer

  • 相关阅读:
    Android 2.2 r1 API 中文文档系列(11) —— RadioButton
    Android API 中文 (15) —— GridView
    Android 中文 API (16) —— AnalogClock
    Android2.2 API 中文文档系列(7) —— ImageButton
    Android2.2 API 中文文档系列(6) —— ImageView
    Android 2.2 r1 API 中文文档系列(12) —— Button
    Android2.2 API 中文文档系列(8) —— QuickContactBadge
    [Android1.5]TextView跑马灯效果
    [Android1.5]ActivityManager: [1] Killed am start n
    Android API 中文(14) —— ViewStub
  • 原文地址:https://www.cnblogs.com/qingchen1984/p/5056355.html
Copyright © 2011-2022 走看看