Bitmap和Drawable

  • 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 DrawableViewcontextContextattrAttributeSet):Viewcontextattr){
private val drawable = ColorDrawable(Color.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,也是一个辅助测量展示的参数。

0 个评论

要回复文章请先登录注册