Movie播放Gif,完美实现屏幕适配
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,完美实现屏幕适配的更多相关文章
- 给你一个全自动的屏幕适配方案(基于SW方案)!—— 解放你和UI的双手
Calces系列相关文章:Calces自动实现Android组件化模块构建 前言 屏幕适配一直是移动端开发热议的问题,但是适配方案往往在实际开发的时候会和UI提供的设计稿冲突.本文主要是基于官方推荐的 ...
- autoLayout+sizeClass屏幕适配
一.屏幕适配(autoLayout+sizeClass) 1.目前市面上的主流布局形式: a. frame 布局,通过代码计算(老程序员习惯使用) b. autoLayout(新的出现)与sizeCl ...
- Android屏幕适配笔记
1.限定符 为了适配不同屏幕大小的android手机或android平板,有时候就需要利用限定符来为不同的屏幕设定不同的布局文件,在一般情况下我们都是在layout文件夹下为某个活动准备一个默认的布局 ...
- 了解真实的『REM』手机屏幕适配
rem 作为一个低调的长度单位,由于手机端网页的兴起,在屏幕适配中得到重用.使用 rem 前端开发者可以很方便的在各种屏幕尺寸下,通过等比缩放的方式达到设计图要求的效果. rem 的官方定义『The ...
- Unity2D多分辨率屏幕适配方案(转载)
一下内容转自:http://imgtec.eetrend.com/forum/3992 此文将阐述一种简单有效的Unity2D多分辨率屏幕适配方案,该方案适用于基于原生开发的Unity2D游戏,即没有 ...
- [原创]一种Unity2D多分辨率屏幕适配方案
此文将阐述一种简单有效的Unity2D多分辨率屏幕适配方案,该方案适用于基于原生开发的Unity2D游戏,即没有使用第三方2D插件,如Uni2D,2D toolkit等开发的游戏,NGUI插件不受这个 ...
- Cocos2d-x——Cocos2d-x 屏幕适配新解 – 兼容与扩展【转载】
Cocos2d-x 屏幕适配新解 – 兼容与扩展 本文出自[无间落叶](转载请保留出处):http://blog.leafsoar.com/archives/2013/05-13-08.html 在读 ...
- 移动web屏幕适配方案
刚进部门就被拉去趟移动端Web的浑水,视觉稿是按照640px设计的.那如何做屏幕适配呢?当然想到的第一方法就是问前辈了,问他们之前怎么做的,前辈说直接按视觉稿来,我说640太大了,他说除以2啊,按32 ...
- android屏幕适配详解
android屏幕适配详解 官方地址:http://developer.android.com/guide/practices/screens_support.html 一.关于布局适配建议 1.不要 ...
随机推荐
- MYSQL数据库命名与其设计规范
你是否对获得MYSQL数据库命名与其设计规范 的实际操作感到十分头疼?如果是这样子的话,以下的文章将会给你相应的解决方案,以下的文章主要是介绍获得MYSQL数据库命名与其设计规范 的方案,以下就是相关 ...
- .net 文件下载方法
public void DownLoadMethod(string FilePath) { string hzm = Path.GetExtension(FileP ...
- jQuery旋转插件
jQuery旋转插件,支持Internet Explorer 6.0 + .Firefox 2.0.Safari 3.Opera 9.Google Chrome,高级浏览器下使用Transform,低 ...
- 一个CSS小测试
<!DOCTYPE html> <html> <head> <style type="text/css"> body{ margin ...
- 高放的python学习笔记之基本语法
python与c++的不同之处 python的语句块不是用{}括起来的而是冒号后面跟一些与比当前语句多一的tab缩进的语句. 1.定义变量 python的变量类型不需要人为指出,会根据赋值的类型决定此 ...
- 电机KV值对应的桨
KV2200 -6寸 KV1400 -8寸 KV1000 -10寸
- Foj1675数论
http://acm.fzu.edu.cn/problem.php?pid=1675 首先必须知道一点数论的基本公式 (a-b) %c =0 -----> a%c=b%c 首先通过大数取余求出目 ...
- JQUERY1.9学习笔记 之基本过滤器(三)偶数选择器
偶数选择器 jQuery( ":even" ) 例:查询偶数个表格的行. <!DOCTYPE html><html lang="zh-cn"& ...
- js获取对象位置的方法
scrollHeight: 获取对象的滚动高度. scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离 scrollTop:设置或获取位于对象最顶端和窗口中可见内容的最 ...
- 我自己的style
/** DATE:Time AUTHOR:Zoe TEAM:公司名称 INTRO:cssName **/ @charset "utf-8"; /*通用公共样式 开始*/ /* 清除 ...