我们在自定义View的时候总是会用到Paint画笔对象和Canvas对象,我是这么理解的,你要画一个自定义View就必须要有水彩笔和你的A4纸(当然我只是这么一说,也可以使任何纸),水彩笔就相当于Paint画笔对象,可以设置它的颜色,粗细,想要画的字的大小,形状以及一些样式,接下来,我们来看一下这个画笔对象是什么以及怎么使用.
Paint是什么?
首先来看一下官方解释:
The Paint class holds the style and color information about how to draw geometries, text and bitmaps.
用我粗略的英语水平翻译一下,Paint对象保存了样式,颜色信息以及如何画几何图形,写文字和画图片的信息.就可以简单的理解为我上面开篇所说的,就理解成你画画时用的水彩笔就可以了,它有粗细颜色等信息,Paint就是用来保存这些信息.
来看一下Paint的构造函数
总共有三个,我们一一来看一下:
1.创建一个空的Paint,里面什么信息都没有保存
2.根据特殊的flags创建Paint(比如扛锯齿等等),下面介绍怎么用时会说到,莫急
3.创建一个Paint,里面有你创建的上一个Paint对象的一下信息,用来避免重复赋值以及节省代码时间
在来看一下对于Paint来说比较重要的它的6个枚举内部类(可以理解为只有五个)
1.Align 文字的对齐方式
2.Cap 线帽,可能你在此处不怎么理解,下面看效果图就一目了然
3.FontMetrics 字体矩阵,用来控制文字的矩阵变换,里面包含了一些文字的参数变量
4.FontMetricsInt 其实和FontMetrics是差不多的,只不过精度改为了int而已,方法什么的都差不多
5.Join 我理解为线段折弯处的变现,看下面效果也会一目了然
6.Style 样式,这个简单,设置画笔的样式
好了,啰嗦完了,现在可以进入主题了
Paint怎么用?
使用Paint,就意味着要初始化,一般分为这几个步骤,在前几个博客也有讲过
1.继承View
2.重写构造函数
3.初始化Paint对象
4.重写onMeasure(这里我们不重写,以后我们会经常用到)
5.重写onDraw函数
6.(不要忘了在xml文件中运用,需要用包名,不然肯定是没有效果的,是中只有hello world,小错误没必要犯)
我们一般都会选择在构造函数中初始化画笔等的对象,这样每次创建对象的时候都能初始化,而且只有一次,后续需要修改也可以.在onDraw函数中,会有一个画布Canvas对象的使用,如果你不懂,那就请看我的这篇文章--->
我们就从他的6个内部枚举开始讲起,从最简单的开始
Style
public enum Style {
FILL (0), //填充内部
STROKE (1), //描边
FILL_AND_STROKE (2); //描边和填充内部
}
这里第一个给出全部的代码,之后修改的代码就是在两个地方,为了避免重复,你们自己改一下就行了
STROKE
直接上代码,效果跟下面对比很明显
public class MyPaintView extends View {
private Paint mPaint;
public MyPaintView(Context context) {
this(context,null);
}
//这个都构造函数是必须的,我是采用调用下面那个的方式
public MyPaintView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs,0);
}
public MyPaintView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initControl(); //初始化画笔
}
private void initControl() {
mPaint = new Paint();
mPaint.setStyle(Paint.Style.STROKE); //设置成描边的效果,也就是画边框
mPaint.setStrokeWidth(10); //设置描边的宽度粗细
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.translate(getWidth()/2,getHeight()/2); //把画布移动到中间
canvas.drawCircle(0,0,200,mPaint); //画圆
}
}
效果图
额,这图片怎么看起来有点不舒服,总感觉不够圆,毛毛草草的,是吧,(不信你就放大了看,会很明显的),其实圆也是无数条线段画出来的,所以这就会出现一种齿轮的感觉,我们要去掉这种状态就叫做抗锯齿,既然我们都看出来了,那安卓早就想到了,下面我们来解决他.come on~
private void initControl() {
mPaint = new Paint();
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(10);
mPaint.setAntiAlias(true); //设置抗锯齿
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.translate(getWidth()/2,getHeight()/2);
canvas.drawCircle(0,0,200,mPaint);
}
效果图
现在图片看上去是不是舒服多了~圆滑,顺溜,舒服~
就是这样,你没看错,这里就多了一句话,上面用注释标出来了,现在来讲下上面说的根据构造函数来创建Paint对象的方法.
其实flags就是在Paint类下的一些常量,你可以在源码中看到,这里我就介绍一个,其他的类似,自己琢磨一下很容易就懂啦~
private void initControl() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); //创建对象时传入flag
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(10);
// mPaint.setAntiAlias(true);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.translate(getWidth()/2,getHeight()/2);
canvas.drawCircle(0,0,200,mPaint);
}
这里的效果和上面的那个抗锯齿的效果是一样的.就不给效果图了,自己尝试吧~加油宝贝~
除此之外,下面还有很多这样的常量,也可以使用setXXX的方式设置进去,看你自己喜欢咯~
<