Tips: KTX可以直接将bitmap转为Drawable
- val drawable1 = ColorDrawable()
- val bitmap1 = drawable1.toBitmap()
Drawable 也可以直接转为BitMap
- val bitmap = Bitmap.createBitmap(20,20,Bitmap.Config.ARGB_8888)
- val drawable = bitmap.toDrawable(resources)
toDrawable源码:
- /** Create a [BitmapDrawable] from this [Bitmap]. */
- public inline fun Bitmap.toDrawable(
- resources: Resources
- ): BitmapDrawable = BitmapDrawable(resources, this)
toBitmap源码:
- public fun Drawable.toBitmap(
- @Px width: Int = intrinsicWidth,
- @Px height: Int = intrinsicHeight,
- config: Config? = null
- ): Bitmap {
- if (this is BitmapDrawable) {
- if (bitmap == null) {
- // This is slightly better than returning an empty, zero-size bitmap.
- throw IllegalArgumentException("bitmap is null")
- }
- 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 == bitmap.width && height == bitmap.height) {
- return bitmap
- }
- return Bitmap.createScaledBitmap(bitmap, width, height, true)
- }
- }
-
- 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
- }
Bitmap: bit 位 ,map 映射,也就是像素映射到内存对象
Drawable: ColorDrawable 默认范围0.0 需要制定Bounds
drawable 内部维持绘制规则 可以使bitmap color 等
bitmap是像素信息
bitmap和drawable 互转本质上是创建彼此的一个对象实例
bitmapDrawable通过canvas.drawBitmap
自定义Drawable:
drawable 是一个接口 需要实现四个方法:
-
-
- class MatchDrawable : Drawable() {
- override fun draw(canvas: Canvas) {
-
- }
-
- override fun setAlpha(alpha: Int) {
- }
-
- override fun setColorFilter(colorFilter: ColorFilter?) {
- }
-
- override fun getOpacity(): Int {
- }
- }
setColor KTX 可以写 "#0085d0".toColorInt
大多数情况可以使用系统自带的drawable 比如 colorDrawable BitmapDrawable等