drawable转bitmap
drawable转bitmap有两种方法,分别对应不同的格式类型,如我们都知道drawable有两种资源类型,一种是drawables目录下的jpg或png图片,另外一种是xml的drawable,它们转换成bitmap也是不一样的。
jpg或png格式的drawable转bitmap
/**
*
* @param context 上下文
* @param id drawable资源id
* @return
*/
public static Bitmap drawableToBitmap(Context context, int id){
return BitmapFactory.decodeResource(context.getResources(),id);
}
xml格式的drawable转bitmap
/**
* @param drawable xml文件
* @return
*/
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) {
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;
}
bitmap转drawable
/**
*
* @param context 上下文
* @param bitmap 位图
* @return
*/
public static Drawable bitmapToDrawable(Context context,Bitmap bitmap){
return new BitmapDrawable(context.getResources(),bitmap);
}
bitmap是什么
bitmap本质是像素数据的映射,位图信息的存贮
drawable是什么
drawable不是图片信息,而是绘制工具,它是调用canvas的上层工具
bitmap和drawable区别
bitmap负责view的测量布局绘制,drawable只负责绘制
drawable的绘制
为了更好的了解drawable的绘制,我们先举个简单的例子 ,drawable调用setBounds方法确定绘制大小,通过draw方法把canvas作为draw方法的参数传递到drawable内层实现绘制的操作。
public class DrawableView extends View {
Drawable drawable;
public DrawableView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
{
drawable = new ColorDrawable(Color.RED);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
drawable.setBounds(0,0,getWidth(),getHeight());
drawable.draw(canvas);
}
}
自定义drawable
自定义drawable大家可能首先想到的是xml自定义一些view,比如圆,虚线,矩形等等一些比较简单的view,但对于子类继承drawable实现自定义可能读者就很少使用了,这里我们举个网眼例子
第一步:子类MeshDrawable继承Drawable
第二步:初始化画笔
private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
{
paint.setColor(Color.parseColor("#1E88E5"));//画笔颜色
paint.setStrokeWidth(DisplayUtils.dpToPx(5));//画笔宽度
}
第三步:重写drawable四个方法
@Override
public void draw(@NonNull Canvas canvas) {
Rect bounds = getBounds();
for (int x=0;x<bounds.right;x+=INTERVAL){//画竖线
canvas.drawLine(x,bounds.top,x,bounds.bottom,paint);
}
for (int y=0;y<bounds.bottom;y+=INTERVAL){//画横线
canvas.drawLine(bounds.left,y,bounds.right,y,paint);
}
}
/**
* @param alpha 透明度
*/
@Override
public void setAlpha(int alpha) {
paint.setAlpha(alpha);
}
@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {
paint.setColorFilter(colorFilter);
}
/**
* 不透明
* @return
*/
@Override
public int getOpacity() {
return paint.getAlpha() == 0xff? PixelFormat.OPAQUE:
paint.getAlpha() == 0?PixelFormat.TRANSPARENT:
PixelFormat.TRANSLUCENT;
}
运行结果
image.png
网友评论