Android开发学习笔记——自定义View(二)自定义View绘图

本文详细介绍了Android自定义View的绘图知识,包括坐标系、Paint和Canvas的使用,如设置线条样式、线帽、线段连接处样式、图像混合模式。还讲解了Canvas的裁剪、变换以及Path的绘制,如绘制不规则图形。了解这些知识点能帮助开发者实现更复杂的界面效果。


在Android开发中,如果我们想要实现更加复杂和绚丽的界面效果,我们不能仅仅了解Android提供的系统组件,还需要学习自定义View来创建自己想要的效果。在实际开发中,自定义View通常包括了自定义组合控件,方便复用;继承系统组件扩展功能以及最灵活、实现效果最复杂的继承View来绘制组件几种方式。前两种方式由于复用了系统组件的功能,因此实现起来相对方便,快捷,但同时也限制了其灵活性,如果我们想要开发一个完全自由的组件,优秀的自定义View,通常我们需要直接继承自View,手动实现其Mesure、Layout和Draw过程。其中Draw过程是最重要的,这最终决定了自定义View的样子,具体实现就是通过绘图的方式来实现onDraw方法。

坐标系

要学习View绘图的相关知识,首先,我们需要学习在Android系统中的相关坐标系。在Android系统中,坐标系是以左上角为原点,竖直向下方向为y轴正方向、水平向右为x轴正方向的,而View的位置主要是由其四个顶点来决定的,分别对应于View的四个属性:top、left、right和bottom。其中,top为view左上顶点的y轴坐标,left为view左上顶点的x轴坐标,right为view右下顶点的x轴坐标,bottom为view右下顶点的y轴坐标。值得注意的是,这四个坐标都是相对于view的父容器的坐标。具体如下图所示:
Android坐标系
通过上图,我们可以了解到View的宽高和坐标系的关系:

width = right-left
height = bottom-top

Paint和Canvas

自定义View的实现方式主要就是通过实现onDraw方法,在onDraw方法中绘制对应的View,而绘制的主要方法就是通过Paint和Canvas两个类,其中Canvas就相当于画布,Paint相当于画笔,就好像画画一样,通过利用画笔在画布上画画就可以得到我们想要的View。

Paint

Paint在绘制过程中就相当于画笔,和画画一样,在绘制前我们需要为“画笔”设置好其颜色、粗细等属性,其基本的方法如下所示:

方法 说明
setAntiAlias 设置是否抗锯齿
setARGB/setColor 设置颜色
setAlpha 设置透明度
setDither 设置是否使用图像抖动,会使图像更加清晰饱满
setStrokeWidth 设置画笔粗细
setShadowLayer 设置阴影
setStyle 设置填充样式
setStrokeCap 设置端点样式
setStrokeJoin 设置线段连接处样式
setXfermode 设置图像重叠处理
setMaskFilter 设置滤镜效果
setColorFilter 设置颜色过滤
reset 重置画笔所有设置

对于Paint,我们所需要的就是设置好各种属性,为之后绘制图形做好准备工作,我们只需要调用相应的方法即可。

setStyle

对于setStyle方法,主要存在三种填充样式,如下:

  • Paint.Style.FILL:填充
  • Paint.Style.STROKE:描边
  • Paint.Style.FILL_AND_STROKE:填充且描边
    代码如下:
mPaint.style = Paint.Style.STROKE//描边
canvas?.drawCircle(400f, 400f, 200f, mPaint)
mPaint.style = Paint.Style.FILL//填充
canvas?.drawCircle(400f, 800f, 200f, mPaint)
mPaint.style = Paint.Style.FILL_AND_STROKE//描边并填充
canvas?.drawCircle(400f, 1210f, 200f, mPaint)

具体实现效果如下图:
在这里插入图片描述
从上图,我们可以清楚的看到Paint.Style.STROKE和其它两个样式的区别,那么Paint.Style.FILL和Paint.Style.FILL_AND_STROKE又有什么区别呢?我们将两者重叠,就会发现,其实Paint.Style.FILL_AND_STROKE是在Paint.Style.FILL的基础上加上了一个描边,因此实际上是略大的,在实际开发中我们一般使用填充样式即可,如下图:
在这里插入图片描述

setsetStrokeCap

setStrokeCap方法的作用为设置线两端的样式,包括以下几种样式:

  • Paint.Cap.BUTT:默认实现,无线帽
  • Paint.Cap.ROUND:圆形线帽,即线两端为圆角
  • Paint.Cap.SQUARE:方形线帽,即线两端为方形
    我们绘制几条线,分别展示三种样式:
 mPaint.strokeCap = Paint.Cap.BUTT//默认无
 canvas?.drawLine(200f,200f,800f,200f, mPaint)
 mPaint.strokeCap = Paint.Cap.SQUARE//方形
 canvas?.drawLine(200f,300f,800f,300f, mPaint)
 mPaint.strokeCap = Paint.Cap.ROUND//圆角
 canvas?.drawLine
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值