简述
自定义控件具有很强的灵活性,可以根据你的想法画出各种各样的图案,在Android中如果是自定义控件的话,Paint这个类用的还是较多的,这一篇就来简单介绍Paint这个类的使用.
基本方法
-
初始化一个画笔
Paint mPaint = new Paint();
-
画笔的重置,在自定义控件时,前面设置了画笔的各个参数,如果后面还要用到画笔但要更改参数, 这时就不用重新new一个画笔,直接重置下就可以了
mPaint.reset();
-
设置画笔的颜色
mPaint.setColor(Color.RED);
-
设置画笔的样式(有三种样式,看以下图就明白了)
//Paint.Style.FILL //填充 //Paint.Style.FILL_AND_STROKE //描边加填充 //Paint.Style.STROKE;//描边 mPaint.setStyle(Paint.Style.FILL);
-
设置画笔的宽度
mPaint.setStrokeWidth(30);
-
防锯齿,设置为true时,会损失一定的性能,使用时视情况而定
mPaint.setAntiAlias(true);
-
设置是否使用图像抖动处理。会使绘制的图片等颜色更加的清晰以及饱满。(也是损失性能)
mPaint.setDither(true);
-
笔帽,就是画笔画出来的线的两端的样式,(直接看图是按,有三种样式)
mPaint.setStrokeCap(Paint.Cap.BUTT);//没有样式 mPaint.setStrokeCap(Paint.Cap.ROUND);//圆形 mPaint.setStrokeCap(Paint.Cap.SQUARE);//方形
-
两线相交样式(还是看图,有三种样式应该能明白)
mPaint.setStrokeJoin(Paint.Join.MITER);//锐角 mPaint.setStrokeJoin(Paint.Join.ROUND);//圆角 mPaint.setStrokeJoin(Paint.Join.BEVEL);//直线
文字绘制方法
-
获取字符行间距
mPaint.getFontSpacing();
-
获取字符间间距
mPaint.getLetterSpacing();
-
设置字符间间距
mPaint.setLetterSpacing(12);
-
设置字符大小
mPaint.setTextSize(20);
-
文本对齐方式
mPaint.setTextAlign(Paint.Align.CENTER);//居中 mPaint.setTextAlign(Paint.Align.LEFT);//左对齐 mPaint.setTextAlign(Paint.Align.RIGHT);//右对齐
-
设置字体类型
mPaint.setTypeface(Typeface.DEFAULT_BOLD); // Typeface.create(familyName, style)//加载自定义字体
-
文字倾斜 默认0,官方推荐的-0.25f是斜体
mPaint.setTextSkewX(-0.25f);
-
计算制定长度的字符串(字符长度、字符个数、显示的时候真实的长度)
//measureForwards为true,从头开始测否则从尾向前测 //maxWidth 最大的宽度 //measuredWidth实测长度 //int breadText = mPaint.breakText(text, measureForwards, maxWidth, measuredWidth)
-
Rect bounds获取文本的矩形区域(宽高)
mPaint.getTextBounds(text, index, count, bounds) mPaint.getTextBounds(text, start, end, bounds)
-
获取文本的宽度,和上面类似,但是是一个比较粗略的结果
float measureText = mPaint.measureText(str);
-
获取文本的宽度,和上面类似,但是是比较精准的。
float[] measuredWidth = new float[10]; //measuredWidth得到每一个字符的宽度;textWidths字符数 int textWidths = mPaint.getTextWidths(str, measuredWidth); mPaint.getTextWidths(text, start, end, widths) Log.i("RICKY", "measureText:"+measureText+", textWidths:"+textWidths);
文字的基线
这里着重来讲解一下文字的基线,应该好多同仁都不是很清楚,先看一下下面的图,多像我们小学写拼音的本子啊 >>>>>>>>>>>>>我看了半天还是看不明白,好吧,让我慢慢道来:
image.png
先看一下我们绘制文字的方法:
canvas.drawText(str, X, Y, mPaint);
在这个方法中,X,Y就是确定文字绘制的位置,但是X,Y到底是设多少好呢,其实X还是比较好确认的,这里暂时先不讲,着重讲一下这个Y.
这个Y不是文字的左上角,而是上图的baseline,这下你应该清楚了吧,为什么每次绘制文字时总时画不到自己想要的位置上了;
从上图我们可以看出有五种线:
-
top线:就是文字绘制的顶线,文字是不会超过这个顶线的
-
ascent 线:
-
baseline线:就是文字绘制的基准线,但是这个线实际是不存在的
-
descent线:
-
bottom线:就是文字绘制裁的底线,文字是不会越过这个底线的
FontMetrics fontMetrics = mPaint.getFontMetrics(); fontMetrics.top; fontMetrics.ascent; fontMetrics.descent; fontMetrics.bottom;
通上以前方法可以得四线的值,其实这些值以基线baseLine为基准来计算的。baseline以上的就是负的;以下的是正的。
讲到这里你应该清楚了吧,好吧,在这里我再讲二个实例,结合实例应该会更清楚些;
-
1)实例:指定左上角的顶点坐标 绘制文本
公式: float baselineY = Y - fontMetrics.top;
-
2)实例:指定中间位置,绘制文本
公式: float baselineY = centerY + (fontMetrics.bottom-fontMetrics.top)/2 - fontMetrics.bottom
网友评论