博客
关于我
Movie播放Gif,完美实现屏幕适配
阅读量:796 次
发布时间:2023-02-09

本文共 2070 字,大约阅读时间需要 6 分钟。

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();
    }
}

转载地址:http://svffk.baihongyu.com/

你可能感兴趣的文章
MySQL 数据库备份种类以及常用备份工具汇总
查看>>
mysql 数据库存储引擎怎么选择?快来看看性能测试吧
查看>>
MySQL 数据库操作指南:学习如何使用 Python 进行增删改查操作
查看>>
MySQL 数据库的高可用性分析
查看>>
MySQL 数据库设计总结
查看>>
Mysql 数据库重置ID排序
查看>>
Mysql 数据类型一日期
查看>>
MySQL 数据类型和属性
查看>>
mysql 敲错命令 想取消怎么办?
查看>>
Mysql 整形列的字节与存储范围
查看>>
mysql 断电数据损坏,无法启动
查看>>
MySQL 日期时间类型的选择
查看>>
Mysql 时间操作(当天,昨天,7天,30天,半年,全年,季度)
查看>>
MySQL 是如何加锁的?
查看>>
MySQL 是怎样运行的 - InnoDB数据页结构
查看>>
mysql 更新子表_mysql 在update中实现子查询的方式
查看>>
MySQL 有什么优点?
查看>>
mysql 权限整理记录
查看>>
mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
查看>>
MYSQL 查看最大连接数和修改最大连接数
查看>>