android播放gif  我研究过3种

第一 :GifView支持android播放gif,效果是 先加载第一帧,然后慢慢加载完其他的针,这样效果视觉很不好,是从模糊到清晰的过程;
第二:是流行的把gif图片通过工具分拆成n帧,然后使用逐帧动画播放,我感觉很麻烦的样子;
第三 :使用Movie提供的Movie.decodeStream()方法解析gif,然后通过文件流的方式播放,效果特别好 ,和原图片没差

研究之后可以通过canvas实现对gif的拉伸,适配任何屏幕。

核心代码  自己加个layout,Activity测试
public class GifView extends View {

private Movie mMovie;
    private long mMovieStart;

private int mWidth, mHeight;
    private int mViewWidht, mViewHeight;

private OnPlayListener onPlayListener;

public GifView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // TODO Auto-generated constructor stub
    }

public GifView(Context context) {
        super(context);

mMovie = Movie.decodeStream(getResources().openRawResource(
                R.raw.gif_anim));
    }

public GifView(Context context, AttributeSet attrs) {
        super(context, attrs);
        //使用Movie解析gif图片
        mMovie = Movie.decodeStream(getResources().openRawResource( R.raw.gif_anim));
        //获得屏幕宽度,高度
        mWidth = BaseApplication.getInstance().screenWidth;
        mHeight = BaseApplication.getInstance().screenHeight;
        //gif图片宽度,高度
        mViewHeight = mMovie.height();
        mViewWidht = mMovie.width();
    }
        
    public OnPlayListener getOnPlayListener() {
        return onPlayListener;
    }
        
    public void setOnPlayListener(OnPlayListener onPlayListener) {
        this.onPlayListener = onPlayListener;
    }

boolean isDraw = true;

public void onDraw(Canvas canvas) {
        long now = android.os.SystemClock.uptimeMillis();

if (isDraw) {

if (mMovieStart == 0) { // first time
                mMovieStart = now;
            }
            if (mMovie != null) {

int dur = mMovie.duration();
                if (dur == 0) {
                    dur = 5000;
                }
                //计算gif播放时间,gif播放完成,关闭界面
                if (now - mMovieStart >= dur) {
                    isDraw = false;
                    if (onPlayListener != null) {
                        onPlayListener.onFinished();
                    }
                }

int relTime = (int) ((now - mMovieStart) % dur);

mMovie.setTime(relTime);
                //根据屏幕大小计算缩放比例
                float saclex = (float) mWidth / (float) mViewWidht;
                float sacley = (float) mHeight / (float) mViewHeight;
                float sameRate = saclex > sacley ? saclex : sacley;
                canvas.scale(sameRate, sameRate);
                mMovie.draw(canvas, 0, 0);

invalidate();
            }
        }
    }
        //gif关闭接口
    public static interface OnPlayListener {
        public void onFinished();
    }
}

Movie播放Gif,完美实现屏幕适配相关推荐

  1. html vw布局,完美的响应式布局vw+vh+rem屏幕适配方案!

    一.前言 根据前面写的 你不知道的css单位,进行了一种响应式布局的思考. 视口布局的优点:宽度和高度全部自动适应!再加上rem布局的字体适应,可以完美解决各种屏幕适配问题! 单位可参考 : 你不知道 ...

  2. 【原】android【手机】屏幕适配解决方案,完美适配适配hdpi,xhdpi,xxhdpi的做法。

    [原]android[手机]屏幕适配解决方案,完美适配适配hdpi,xhdpi,xxhdpi的做法. 参考文章: (1)[原]android[手机]屏幕适配解决方案,完美适配适配hdpi,xhdpi, ...

  3. android曲面屏触摸事件,Android屏幕适配完美解决方案(曲面屏手机也是小Case)

    纸上得来终觉浅 绝知此事要躬行. 安卓中最头疼的一个问题就是屏幕适配,然而现在网上关于屏幕适配的博客都是纸上谈兵:dp的概念.dp转px.只有少数博客才是讲到点,比如 鸿洋 大神的 Android 屏 ...

  4. autoLayout+sizeClass屏幕适配

    一.屏幕适配(autoLayout+sizeClass) 1.目前市面上的主流布局形式: a. frame 布局,通过代码计算(老程序员习惯使用) b. autoLayout(新的出现)与sizeCl ...

  5. Android 屏幕适配从未如斯简单(8月10日最终更新版)

    前言 一个月前看了今日头条新的屏幕适配方案,这是传送门,对此不禁拍案叫绝,为此我想把这种方案融入到我工具类中直接一行代码即可适配,如今最新 1.19.0 版 AndroidUtilCode 已有其最新 ...

  6. android wm 改变大小,Android 屏幕适配经验总结

    本文记录一些适配问题的研究,基础概念不做过多介绍. Android在做屏幕适配的时候一般考虑两个因素:分辨率和dpi.分辨率是屏幕在横向.纵向上的像素点数总和,一般用"宽x高"的形 ...

  7. 今日头条屏幕适配方案落地研究

    目录 前言 各平板数据比较 为什么看起来更小了?(头条方案跟最小宽度方案比较) smallesWidth 方案迁移 优缺点 issue 附录(适配核心代码) 前言 大家好,现在给大家推荐一种极低版本的 ...

  8. android屏幕适配详解

    android屏幕适配详解 官方地址:http://developer.android.com/guide/practices/screens_support.html 一.关于布局适配建议 1.不要 ...

  9. android ui布局适配,Android适配全面总结(一)----屏幕适配

    前言 Android适配是一个老生常谈的问题,很多程序员觉得很恶心,不愿意做适配,但是又不得不做.然后老板说,这位兄弟,做好了,今天晚饭给你加个鸡腿,然后程序员开始找各种资料,忙活起来了,最终在苦逼的 ...

最新文章

  1. CSS盒子模型(border、padding、margin、圆角边框、盒子阴影、文字阴影、新闻列表综合案例、新浪导航栏案例)
  2. iOS定义静态变量、静态常量、全局变量
  3. Swin Transformer对CNN的降维打击
  4. Ubuntu 安装 Qt 开发环境(转)
  5. 万劫不复:恐怖悬疑话剧《下一个就是你》
  6. 如何建立好的索引.--针对Distinct
  7. 如何解决文件不存在_传奇微端配置Pak密码文件不存在怎么解决?传奇分享汇
  8. SpringMVC 集成 mybatisPlus
  9. Jmeter+Ant+Jenkins接口自动化持续集成环境搭建(Linux)
  10. Lua学习笔记9:多文件
  11. cmi码型变换matlab程序_58 张图,手把手教会你 Simscape Multibody 物理建模与刚体变换!...
  12. Bitvise SSH Client
  13. 最短路 POJ2387
  14. 详解TCP的四报文挥手
  15. 判断是页面否为微信打开
  16. Python 日志logging模块初探及多线程踩坑(2)
  17. 块闻热点:做最真实的区块链资讯宣传媒体
  18. Oracle 数据库
  19. 二级域名做网站有哪些优势?
  20. Android琐碎知识点,不断更新中

热门文章

  1. Linux下用vi 打开文件出现乱码
  2. WIN7 X64 如何删除计算机管理里面一些无效的服务
  3. HttpModuel
  4. Beanstalkd消息队列的安装与使用
  5. Executors中的几种线程调用方式
  6. XML——XML的那些事
  7. 一些编译php时的configure 参数
  8. git pull命令模式
  9. 深入了解preventDefault与stopPropagation
  10. MinGW: TOO MANY SECTIONS issue