Movie播放Gif,完美实现屏幕适配

本文探讨了三种Android平台上的GIF播放方法:GifView组件、逐帧动画及使用Movie类。重点介绍了Movie类的实现方式及其优点,并给出了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值