天天看点

自定义控件学习之canvas和paint相关知识点学习

1,继承自view,实现ondraw方法:

    初始化画笔,TextPaint paint,并设置画笔属性:

      paint.setFlags(Paint.ANTI_ALIAS_FLAG):画笔抗锯齿。

      paint.setStyle(Paint.Style.STROKE):设置画笔样式,默认全部填充Full

        {  1.Paint.Style.STROKE:描边;

            2.Paint.Style.FILL_AND_STROKE:描边并填充

            3.Paint.Style.FILL:填充

        }

     paint.setStrokeCap(Paint.Cap.ROUND):画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的图形样式

       {   1,圆形样式    Cap.ROUND,

           2,方形样式  Cap.SQUARE 

       }

     paint.setColor(0xff00ff00):设置画笔颜色

     Canvas.drawLine(float startX, float startY, float stopX, float stopY, Paint paint):利用TextPaint在canvas上绘制线条:坐标从(startX,startY)到(stopX,stopY),坐标点起点为左上角,起点为0,0

2,在xml布局里面设置自定义布局控件

 背景颜色绘制:

  canvas.drawARGB(a, r, g, b):其中a,r,g,b为0到255的int值,用来组成画布的背景颜色

  canvas.drawColor(Color.BLUE) :将会以颜色ARBG填充整个控件的Canvas背景

  canvas.drawColor(Color.BLUE, Mode.SCREEN) :绘制颜色,但是要制定一个mode

    mode参数:

    

自定义控件学习之canvas和paint相关知识点学习

    对应下图:

自定义控件学习之canvas和paint相关知识点学习

    对应如下规则:

       SRC :只绘制源图像

       DST :只绘制目标图像 

       DST_OVER :在源图像的顶部绘制目标图像 

       DST_IN :只在源图像和目标图像相交的地方绘制目标图像 

       DST_OUT :只在源图像和目标图像不相交的地方绘制目标图像 

       DST_ATOP :在源图像和目标图像相交的地方绘制目标图像,在不相交的地方绘制源图像 

       SRC_OVER :在目标图像的顶部绘制源图像 

       SRC_IN :只在源图像和目标图像相交的地方绘制源图像 

       SRC_OUT :只在源图像和目标图像不相交的地方绘制源图像 

       SRC_ATOP :在源图像和目标图像相交的地方绘制源图像,在不相交的地方绘制目标图像 

       XOR :在源图像和目标图像重叠之外的任何地方绘制他们,而在不重叠的地方不绘制任何内容 

      LIGHTEN :获得每个位置上两幅图像中最亮的像素并显示 

       DARKEN :获得每个位置上两幅图像中最暗的像素并显示

      MULTIPLY :将每个位置的两个像素相乘,除以255,然后使用该值创建一个新的像素进行显示。结果颜色=顶部颜色*底部颜色/255 

       SCREEN :反转每个颜色,执行相同的操作(将他们相乘并除以255),然后再次反转。结果颜色=255-(((255-顶部颜色)*(255-底部颜色))/255) 

 如上代码ondraw里面代码:

效果:

自定义控件学习之canvas和paint相关知识点学习
自定义控件学习之canvas和paint相关知识点学习
自定义控件学习之canvas和paint相关知识点学习

效果如下:

自定义控件学习之canvas和paint相关知识点学习

 效果:

自定义控件学习之canvas和paint相关知识点学习
自定义控件学习之canvas和paint相关知识点学习

擦,还有这种:

自定义控件学习之canvas和paint相关知识点学习

如上三种方法来进行绘制方块:

canvas.drawcircle为绘制圆

自定义控件学习之canvas和paint相关知识点学习

 绘制圆,style有三种:

自定义控件学习之canvas和paint相关知识点学习

代码试试,看看效果:

填充,填充轮廓和里面

Fill或者Fill_AND_STROKE:

效果如上图:

设置为:

Stoke,绘制轮廓

paint.setStyle(Style.STROKE);

自定义控件学习之canvas和paint相关知识点学习

 虽然调用的是drawoval,其实还是主要通过RectF和上下左右的位置的计算来进行控制

paint.setStyle(Style.STROKE)为图2

自定义控件学习之canvas和paint相关知识点学习
自定义控件学习之canvas和paint相关知识点学习

BitmpaUtils.drawableToBitmap方法代码,将drawable转换为bitmap:

执行效果:

自定义控件学习之canvas和paint相关知识点学习

缩放借助Matrix来实现:

看下效果,宽高缩小一半:

自定义控件学习之canvas和paint相关知识点学习

对图片进行旋转:

matrix.postRotate(45);

自定义控件学习之canvas和paint相关知识点学习

继续阅读