Bitmap与Drawable

2021-04-08  本文已影响0人  王灵

Bitmap和Drawable分别是什么

Bitmap和Drawable的互相转换及本质

bitmap->drawable

//BitmapDrawable的`public void draw(Canvas canvas) `函数的实质就是`canvas.drawBitmap`
BitmapDrawable(resources, bitmap)

drawable->bitmap

fun Drawable.toBitmap(
    @Px width: Int = intrinsicWidth,
    @Px height: Int = intrinsicHeight,
    config: Config? = null
): Bitmap {
    //先判断这个drawable是不是BitmapDrawable类型,如果是直接取出其中的bitmap
    if (this is BitmapDrawable) {
        if (config == null || bitmap.config == config) {
            // Fast-path to return original. Bitmap.createScaledBitmap will do this check, but it
            // involves allocation and two jumps into native code so we perform the check ourselves.
            if (width == intrinsicWidth && height == intrinsicHeight) {
                return bitmap
            }
            return Bitmap.createScaledBitmap(bitmap, width, height, true)
        }
    }
   //如果不是bitmap类型,则创建bitmap,然后使用bitmap创建画布`Canvas(bitmap)`然后用drawable在画布上绘制。于是bitmap上就有了对应的像素信息
    val (oldLeft, oldTop, oldRight, oldBottom) = bounds

    val bitmap = Bitmap.createBitmap(width, height, config ?: Config.ARGB_8888)
    setBounds(0, 0, width, height)
    draw(Canvas(bitmap))

    setBounds(oldLeft, oldTop, oldRight, oldBottom)
    return bitmap
}

自定义Drawable意义

drawable的意义就在于视图复用。最常见的recycleview的itemview,我们一般都会自定义一个itemview,里面包换布局信息和交互处理;然后如果有这么一个需求,需要用自定义view实现横竖两种布局样式,而在横竖两种布局样式中都包含一个同样的绘制部分,那自定义drawable的作用就体现出来了。

上一篇下一篇

猜你喜欢

热点阅读