美文网首页
bitmap与drawable互转以及原理-自定义view(四)

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

作者: 程序猿峰岑 | 来源:发表于2019-12-17 12:45 被阅读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

    相关文章

      网友评论

          本文标题:bitmap与drawable互转以及原理-自定义view(四)

          本文链接:https://www.haomeiwen.com/subject/stxsnctx.html