>>分享Android开发相关的技术 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 19440 个阅读者 刷新本主题
 * 贴子主题:  Android 解码播放GIF图像 回复文章 点赞(0)  收藏  
作者:sunshine    发表时间:2020-03-31 13:08:28     消息  查看  搜索  好友  邮件  复制  引用

      Android 播放GIF之前就有过一篇文章是讲述如何使用GIF文件并播放。可以通过 这里 了解关于播放GIF的一种方法。

  如果前面有了解过的朋友肯定知道这上面的做法比较麻烦,又要去分解图片,又要写各种麻烦的XML文件,有点郁闷,而且还带来的直接后果是一个比较多动作的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();
            }
        });



[这个贴子最后由 flybird 在 2020-04-18 17:16:01 重新编辑]
  Java面向对象编程-->面向对象开发方法概述之UML语言(下)
  JavaWeb开发-->Web运作原理(Ⅳ)
  JSP与Hibernate开发-->第一个helloapp应用
  Java网络编程-->通过JavaMail API收发邮件
  精通Spring-->绑定表单
  Vue3开发-->Vue CLI脚手架工具
  Android中Activity之间的通信
  Android 安装实战
  Android SDCard UnMounted 流程分析
  Android的Service和广播的讲解
  Android代码混淆的实践
  浅析Android的通知系统
  Android UI优化—从Android渲染原理理解UI卡顿
  Android 服务(Service)
  Android 资源(Resources)管理
  程序员笔记|JSBridge框架解决通信问题实现移动端跨平台开发
  Android Service学习之AIDL, Parcelable和远程服务-学习Andr...
  Android网络编程之Http通信
  Android Resource介绍和使用-学习Android
  【Android 修炼手册】Gradle 篇 -- Gradle 的基本使用
  MotionLayout 运动布局入门
  更多...
 IPIP: 已设置保密
树形列表:   
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。