• 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

  • 相关阅读:
    SQL Server(00):分析函数
    SQL Server(00):序列SEQUENCE
    .NET Standard 、.NET Core、 .NET Framework的区别
    电脑音频播放器 foobar2000
    JavaScript:highcharts图表
    SQL Server(00):带有OUTPUT的INSERT,DELETE,UPDATE
    [开发笔记]-js判断用户的浏览设备是移动设备还是PC
    [开发笔记]-获取天气数据接口
    [开发笔记]-控制Windows Service服务运行
    C#程序调用cmd执行命令
  • 原文地址:https://www.cnblogs.com/qingchen1984/p/5056355.html
Copyright © 2020-2023  润新知