Skip to content

Latest commit

 

History

History
161 lines (114 loc) · 7.92 KB

decoder.md

File metadata and controls

161 lines (114 loc) · 7.92 KB

Decoder

Decoder 用于解码图片文件得到一个 Bitmap 或 Drawable,因此 Sketch 有两种 Decoder:

BitmapDecoderDrawableDecoder 各有一个 Decoder 列表,需要解码时 Sketch 会根据 ImageRequest 的类型依次遍历对应的 Decoder 列表,直到找到一个能解码当前类型图片的 Decoder,然后调用其 decode 方法得到解码结果

扩展新的 Decoder

1.首先需要实现 BitmapDecoderDrawableDecoder 接口定义你的 Decoder 和它的 Factory,下面以 BitmapDecoder 为例,如下:

class MyBitmapDecoder : BitmapDecoder {

    override suspend fun decode(): Result<BitmapDecodeResult> {
        // 在这里解析图片
    }

    companion object {
        const val MY_MIME_TYPE = "image/mypng"
    }

    class Factory : BitmapDecoder.Factory {

        override fun create(
            sketch: Sketch,
            requestContext: RequestContext,
            fetchResult: FetchResult
        ): BitmapDecoder? {
            val mimeType = fetchResult.mimeType
            val dataSource = fetchResult.dataSource
            // 在这通过 mimeType 或 dataSource 判断当前图片是否是
            // MyBitmapDecoder 的目标类型,是的话返回一个新的 MyBitmapDecoder
            return if (fetchResult.mimeType == MY_MIME_TYPE) {
                MyBitmapDecoder()
            } else {
                null
            }
        }
    }
}

2.然后在配置 Sketch 时通过 components 方法将其 Factory 注册到 Sketch,这样所有的 ImageRequest 都可以使用,如下:

class MyApplication : Application(), SketchFactory {

    override fun createSketch(): Sketch {
        return Sketch.Builder(this).apply {
            components {
                addBitmapDecoder(MyBitmapDecoder.Factory())
            }
        }.build()
    }
}

或者在显示图片时只给当前 ImageRequest 注册,这样就只有当前 ImageRequest 可以使用,如下:

imageView.displayImage("mypng://my.png") {
    components {
        addBitmapDecoder(MyBitmapDecoder.Factory())
    }
}

注意:自定义 Decoder 需要应用 ImageRequest 中的很多与图片质量和尺寸相关的属性,例如 bitmapConfig、resize、colorSpace 等,可参考其它 Decoder 实现

3.自定义 DrawableDecoderBitmapDecoder 流程一样,唯一区别在于注册到 Sketch 时要调用 addDrawableDecoder() 方法

注意:如果你自定义的 DrawableDecoder 是解码动图的话一定要判断 ImageRequest.disallowAnimatedImage 参数