Andrid Bimap 和 Drawable

BitmapDrawable

1、Bitmap 是什么?

Bitmap

Bitmap 存储的是每一个像素点的信息

Drawable 是一个可画的对象, 可能是一个位图(BitmapDrawable), 也可能是一个图形(ShapeDrawable)

class DrawableView(context: Context?, attrs: AttributeSet?) : View(context, attrs) {

    var mDrawable = MeshDrawable()

    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        canvas ?: return


        mDrawable.apply {
            setBounds(0, 0, width, height)
            draw(canvas)
        }
    }
}

2、BitmapDrawable 互转(https://corochann.com/convert-between-bitmap-and-drawable-313.html)

Bitmap to Drawable
Drawable d = new BitmapDrawable(getResources(), bitmap);
Drawable to Bitmap
public static Bitmap drawableToBitmap (Drawable drawable) {
    Bitmap bitmap = null;
 
    if (drawable instanceof BitmapDrawable) {
        BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
        if(bitmapDrawable.getBitmap() != null) {
            return bitmapDrawable.getBitmap();
        }
    }
 
    if(drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
        // Single color bitmap will be created of 1x1 pixel
        bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); 
    } else {
        bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
    }
 
    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);
    return bitmap;
}

3、自定义 Drawable

自定义 Drawable 一般都是为了重用, 因为大多数时候系统提供的就够用了, 比如 ColorDrawable

class MeshDrawable : Drawable() {

    /**
     * 画笔
     */
    private val mPaint by lazy {
        Paint(Paint.ANTI_ALIAS_FLAG).apply {
            color = Color.parseColor("#1E88E5")
            strokeWidth = dp2px(3F)
        }
    }
    private val INTERVAL by lazy { dp2px(50F).toInt() }

    override fun draw(canvas: Canvas) {
        // 横着画竖线
        for (x in 0 until bounds.right step INTERVAL) {
            canvas.drawLine(x.toFloat(), bounds.top.toFloat(), x.toFloat(), bounds.bottom.toFloat(), mPaint)
        }
        // 竖着画横线
        for (y in 0 until bounds.bottom step INTERVAL) {
            canvas.drawLine(bounds.left.toFloat(), y.toFloat(), bounds.right.toFloat(), y.toFloat(), mPaint)
        }
    }

    override fun setAlpha(alpha: Int) {
        mPaint.alpha = alpha
    }

    override fun getAlpha(): Int = mPaint.alpha

    override fun setColorFilter(colorFilter: ColorFilter?) {
        mPaint.colorFilter = colorFilter
    }

    override fun getColorFilter(): ColorFilter? = mPaint.colorFilter

    override fun getOpacity(): Int {
        return when {
            mPaint.alpha == 0xff -> PixelFormat.OPAQUE
            mPaint.alpha == 0 -> PixelFormat.TRANSPARENT
            else -> PixelFormat.TRANSLUCENT
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值