android 播放动态图,Android播放webp和gif的一种方法(接上篇)

上一篇我们介绍了Android中播放Webp动画的一种方法FrameSequenceDrawable的实现原理,在上篇文章的最后我做了一个预告,本篇就是接上篇的内容,抽象了FrameSequence思想实现了可以播放webp和gif的AnimationSequenceDrawable,主要还是介绍实现的原理,如果你没有看上一篇的内容,建议一定要看一下,了解整个播放的原理后在看本篇,这篇对播放原理不会在介绍,上篇的地址Android中播放webp动画的一种方式:FrameSequenceDrawable

播放效果

在介绍之前,我们还是先看一下播放效果:

67b72fd814f6

播放gif

67b72fd814f6

播放webp

我想直接用

如果你想直接使用,本篇就不直接贴代码了,可以去github查看

没有介绍的类:FrameSequence

上篇在介绍FrameSequenceDrawable时,并没有详细的查看FrameSequence的源码,那么我们现在先来看看FrameSequence在FrameSequenceDrawable都有哪些地方使用到了

public FrameSequenceDrawable(FrameSequence frameSequence, BitmapProvider bitmapProvider) {

if (frameSequence == null || bitmapProvider == null) throw new IllegalArgumentException();

mFrameSequence = frameSequence;

mFrameSequenceState = frameSequence.createState();

//...省略

mFrameSequenceState.getFrame(0, mFrontBitmap, -1);

initializeDecodingThread();

}

@Override

protected void finalize() throws Throwable {

try {

mFrameSequenceState.destroy();

} finally {

super.finalize();

}

}

/**

* Runs on decoding thread, only modifies mBackBitmap's pixels

*/

private Runnable mDecodeRunnable = new Runnable() {

@Override

public void run() {

//...省略

boolean exceptionDuringDecode = false;

long invalidateTimeMs = 0;

try {

invalidateTimeMs = mFrameSequenceState.getFrame(nextFrame, bitmap, lastFrame);

} catch (Exception e) {

// Exception during decode: continue, but delay next frame indefinitely.

Log.e(TAG, "exception during decode: " + e);

exceptionDuringDecode = true;

}

//...省略

}

};

private void scheduleDecodeLocked() {

mState = STATE_SCHEDULED;

mNextFrameToDecode = (mNextFrameToDecode + 1) % mFrameSequence.getFrameCount();

sDecodingThreadHandler.post(mDecodeRunnable);

}

@Override

public void draw(Canvas canvas) {

//...省略

if (mNextFrameToDecode == mFrameSequence.getFrameCount() - 1) {

mCurrentLoop++;

if ((mLoopBehavior == LOOP_FINITE && mCurrentLoop == mLoopCount) ||

(mLoopBehavior == LOOP_DEFAULT && mCurrentLoop == mFrameSequence.getDefaultLoopCount())) {

continueLooping = false;

}

}

//...省略

}

@Override

public int getIntrinsicWidth() {

return mFrameSequence.getWidt

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值