Bitmap和Drawable

892 阅读2分钟
  • Bitmap:图片信息的存储工具,保存每一个像素是什么颜色 image: width:640 height:400 pixel:ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000

  • Drawable是什么(Drawable在代码上是接口,BitmapDrawable、ColorDrawable等实现)? drawable是绘制工具,重写draw进行绘制

  • view和drawable?

  1. 都是使用canvas进行绘制。
  2. drawable纯绘制工具。
  3. view会包含测量、布局、绘制。
  4. drawable绘制的时候一定要设置边界setBounds
class DrawableView(context:Context,attr:AttributeSet):View(context,attr){
    private val drawable = ColorDrawableColor.RED)
    override fun onDraw(canvas:Canvas){
        super.onDraw(canvas)
        drawable.setBounds(0,0,width,height)
        drawable.draw(canvas)
    }
}
  • Bitmap和Drawable怎么互转?(其实不是互转,是使用一个实例创建了另外一个实例)
  1. Bitmap转Drawable java
Drawable d = new BitmapDrawable(getResource(),bitmap);

kotlin(ktx)

bitmap.toDrawable(resource)
  1. Drawable转Bitmap java
public static Bitmap drawableToBitmap(Drawable drawable){
    Bitmap bitmap = null;
    if(drawable instance BitmapDrawable){//1、如果是BitmapDrawable
        BitmapDrawable bitmapDrawable = (BitmapDrawable)drawable;
        if(bitmapDrawable.getBitmap()!=null){
            return bitmapDrawable.getBitmap();
        }
    }
    //2、如果drawable的宽高小于等于0
    if(drawable.getIntrinsicWidth()<=0||drawable.getIntrinsicHeight()<=0){
        bitmap = Bitmap.createBitmap(1,1,Bitmap.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;
}

kotlin(ktx)

drawable.toBitmap()
  • 自定义Drawable(作用:一个自定义drawable可以把多个view中的重复代码提出来,在多个view之间进行复用)
//画一个网眼
private val INTERVAL = 50.dp
class MeshDrawable:Drawable(){
    private val paint = Paint(Paint.ANT_ALIAS_FLAG)
    override fun draw(canvas:Canvas){
        var x = bounds.lef.toFloat()
         while(x<=bounds.right.toFloat()){     
             canvas.drawLine(x,bound.top.toFloat(),
             x,bounds.bottom.toFloat(),paint)
             x+=INTERVAL
         }
         var y = bounds.top.toFloat()
         while(y<=bounds.bottom.toFloat()){
             canvas.drawLine(bounds.left.toFloat(),y,
             bounds.right.toFloat(),y,paint)
             y+=INTERVAL
         }
    }
    override fun setAlpha(alpha:Int){
        paint.alpha = alpha
    }
    override fun getAlpha():Int{
        return paint.alpha
    }
    override fun getOpacity():Int{//不透明度
        return when(paint.alpha){
            0->PixelFormat.TRANSPARENT
            0xff ->PixelFormat.OPAQUE
            else ->PixelFormat.TRANSLUCENT
        }
    }
    override fun setColorFilter(colorFilter:ColorFilter?){
        paint.colorFilter = colorFilter
    }
    override fun getColorFilter():ColorFilter{
        return paint.colorFilter
    }
}

getWidth() 是实际显示的宽度。

getMeasureWidth() 是测量宽度,在布局之前计算出来的。

getIntrinsicWidth() 是原有宽度,有时候原有宽度可能很大,但是实际上空间不够,所有效果上并没有那么大,这个方法可以获得原有宽度,可以辅助测量的时候选择合适的展示宽度。

getMinimumWidth() 是最小宽度,是XML参数定义里的 minWidth,也是一个辅助测量展示的参数。