bitmap与drawable互转以及原理-自定义view(四)

2019-12-17  本文已影响0人  程序猿峰岑

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
上一篇下一篇

猜你喜欢

热点阅读