普通自定义view

android基础

自定义view

 onDraw()

1.drawxxx

背景:

Canvas.drawColor(@ColorInt int color) 颜色填充

drawColor(Color.BLACK);  // 纯黑 

drawColor(Color.parse("#88880000"); // 半透明红色 

canvas.drawRGB(100, 200, 100);  

canvas.drawARGB(100, 100, 200, 100);  

画圆:

drawCircle(float centerX, float centerY, float radius, Paint paint) 圆心坐标 x y  半径 画笔

画矩形 :

drawRect(float left, float top, float right, float bottom, Paint paint)矩形四条边的坐标 画笔

画点:

drawPoint(float x, float y, Paint paint) 点坐标画笔

画点(批量)

drawPoints(float[] pts, int offset, int count, Paint paint) / drawPoints(float[] pts, Paint paint) 

pts 这个数组是点坐标的x和y的数

offset 表示跳过数组的前几个数(数组中的几个数)再开始记坐标

count 表示一共要绘制几个点坐标的x和y的总个数

 画椭圆

drawOval(float left, float top, float right, float bottom, Paint paint) left, top, right, bottom 是这个椭圆的左、上、右、下四个边界点的坐标 画笔

只能绘制横着的或者竖着的椭圆,不能绘制斜的。

 画线

drawLine(float startX, float startY, float stopX, float stopY, Paint paint)线的起点和终点坐标 画笔

由于直线不是封闭图形,所以 setStyle(style) 对直线没有影响。

 画线(批量)

drawLines(float[] pts, int offset, int count, Paint paint) / drawLines(float[] pts, Paint paint) 

pts 这个数组是点的x和y的数

 画圆角矩形:

drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, Paint paint) 

left, top, right, bottom 是四条边的坐标,rx  ry 是圆角的横向半径和纵向半径

 绘制弧形或扇形:

drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, Paint paint)参数  left, top, right, bottom 描述的是这个弧形所在的椭圆;startAngle 是弧形的起始角度(x轴的正向,即正右的方向,是 0 度的位置;顺时针为正角度,逆时针为负角度),sweepAngle 是弧形划过的角度;useCenter 表示是否连接到圆心,如果不连接到圆心,就是弧形,如果连接到圆心,就是扇形

画自定义图形

drawPath(Path path, Paint paint)  通过描述路径的方式来绘制图形的:

Path 方法第一类:直接描述路径。

这一类方法还可以细分为两组:添加子图形和画线(直线或曲线)

第一组:addxxx() ——添加子图形

添加圆

addCircle(float x, float y, float radius, Direction dir) 

添加椭圆

addOval(float left, float top, float right, float bottom, Direction dir) / addOval(RectF oval, Direction dir) 

 添加矩形

addRect(float left, float top, float right, float bottom, Direction dir) / addRect(RectF rect, Direction dir)

添加圆角矩形

addRoundRect(RectF rect, float rx, float ry, Direction dir) / addRoundRect(float left, float top, float right, float bottom, float rx, float ry, Direction dir) / addRoundRect(RectF rect, float[] radii, Direction dir) / addRoundRect(float left, float top, float right, float bottom, float[] radii, Direction dir) 

添加另一个 Path

addPath(Path path) 

 dir 是画圆的路径的方向(后面补充)

路径方向有两种:顺时针 (CW clockwise) 和逆时针 (CCW counter-clockwise)

dir需要填充图形 (Paint.Style  FILL  FILL_AND_STROKE),并且图形出现自相交时,用于判断填充范围的

第二组:xxxTo() ——画线(直线或曲线)

画直线

lineTo(float x, float y) / rLineTo(float x, float y) 

画二次贝塞尔曲线

quadTo(float x1, float y1, float x2, float y2) / rQuadTo(float dx1, float dy1, float dx2, float dy2) 

画三次贝塞尔曲线

cubicTo(float x1, float y1, float x2, float y2, float x3, float y3) / rCubicTo(float x1, float y1, float x2, float y2, float x3, float y3) 

 移动到目标起点位置(设置这些方法的起点)

moveTo(float x, float y) / rMoveTo(float x, float y)

画弧形

arcTo(RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo) / arcTo(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean forceMoveTo) / arcTo(RectF oval, float startAngle, float sweepAngle) 

没有 useCenter  只用来画弧形而不画扇形 

 forceMoveTo  区别在于是否留下移动的痕迹。

     true 现在位置移动到目标起点之间没有痕迹(线) 默认

     false 现在位置移动到目标起点之间有痕迹(线)

画弧形

addArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle) / addArc(RectF oval, float startAngle, float sweepAngle)

是一个直接使用了 forceMoveTo = true 的简化版 arcTo() 

封闭当前子图形

close() 

子图形封闭,即由当前位置向当前子图形的起点绘制一条直线。

 不用close() :当需要填充图形时(即 Paint.Style  FILL  FILL_AND_STROKE)会自动设置

Path 方法第二类:辅助的设置或计算

Path.setFillType(Path.FillType ft) 设置填充方式

参数:EVEN_ODD:「交叉填充」的模式。两个图形相交的默认为图形外部不涂色

(对于平面中的任意一点,向任意方向射出一条射线,这条射线和图形相交的次数(相交才算,相切不算哦)如果是奇数,则这个点被认为在图形内部,是要被涂色的区域;如果是偶数,则这个点被认为在图形外部,是不被涂色的区域。)

          WINDING (默认值)两个图形中的所有线条都是有绘制方向的 

                       相同绘制方向相交的默认内部 涂色 

                       不同绘制方向相交的默认外部 不涂色 

                      (同样是从平面中的点向任意方向射出一条射线,但计算规则不一样:以 0为初始值,对于射线和图形的所有交点,遇到每个顺时针的交点(图形从射线的左边向右穿过)把结果加 1,遇到每个逆时针的交点(图形从射线的右边向左穿过)把结果减 1,最终把所有的交点都算上,得到的结果如果不是 0,则认为这个点在图形内部,是要被涂色的区域;如果是 0,则认为这个点在图形外部,是不被涂色的区域)

        INVERSE_EVEN_ODD  INVERSE_WINDING ,把上面两种效果进行反转而已

*注意:执行完成上述后记得必须加:drawPath(Path path, Paint paint) 

Canvas 还可以绘制 Bitmap 和文字

  Bitmap

 drawBitmap(Bitmap bitmap, float left, float top, Paint paint) left  top 是要把 bitmap 绘制到的位置坐标

drawBitmap 还有一个兄弟方法 drawBitmapMesh(),可以绘制具有网格拉伸效果的 Bitmap 

 绘制文字

drawText(String text, float x, float y, Paint paint)  y 是绘制的起点坐标。text内容

2.Paint

  • Paint.setStyle(Style style) 设置绘制模式 
  • StyleFILL,是填充模式,默认模式
  •            STROKE 是画线模式(即勾边模式)
  •             FILL_AND_STROKE 是两种模式一并使用:既画线又填充。
  •           在 STROKE  FILL_AND_STROKE 下,还可以使用 paint.setStrokeWidth(float width) 来设置线条的宽度:
  • Paint.setColor(int color) 设置颜色
  • Paint.setStrokeWidth(float width) 设置线条宽度 
  • Paint.setTextSize(float textSize) 设置文字大小
  • Paint.setStrokeCap(cap)设置点的形状 圆头 (ROUND)、平头 (BUTT)和方头 (SQUARE) 
  • Paint.setAntiAlias(boolean aa) 设置抗锯齿开关 
  •   图形分辨率过低 看到画面中的像素颗粒而已,不开启抗锯齿,图形的边缘也已经是最完美的了

          抗锯齿的原理是:修改图形边缘处的像素颜色,从而让图形在肉眼看来具有更加平滑的感觉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值