setStrokeWidth()是Paint中的一个方法,自定义View的时候经常用到
(float width) { nSetStrokeWidth(mNativePaint, width); //native 方法 }举个例子,首先自定义一个View,在onDraw()方法中添加如下方法:
Paint rectPaint = new Paint(); rectPaint.setStyle(Paint.Style.STROKE); RectF rect0 = new RectF(100, 100, 700, 700); canvas.drawRect(rect0, rectPaint); Paint paint = new Paint(); paint.setColor(Color.RED); paint.setStrokeWidth(80); paint.setStyle(Paint.Style.STROKE); canvas.drawArc(rect0, 0, 90, false, paint);我的本意是在这个矩形形成一个内切圆弧的但是结果如下:
可以看出一旦要是设置的strokeWidth足够大的情况下,就会有一半在外边了。那要想形成内切弧线就应该对矩形做改变才行。我们把RectF(100, 100, 700, 700) 换成 RectF(140,140,660,660)再次进行尝试。为了和 上图作比较,我在上面的代码上接着添加如下代码:
RectF rect1 = new RectF(140, 140, 660, 660); Paint paint2 = new Paint(); paint2.setColor(Color.BLUE); paint2.setStyle(Paint.Style.STROKE); paint2.setStrokeWidth(80); canvas.drawArc(rect1, 0, -90, false, paint2);效果图如下:
这个时候蓝色圆弧正好为内切弧。
那么可总结为这样:
如果一个矩行要想内切圆写代码的时候只需要在原来的矩行上 left top 各加上strokeWidth的一半, right bottom各减去 strokeWidth的一半即可。
在做比较复杂的自定义View的时候,特别是那种复杂图形之间间距要求比较严谨的情况,一定要充分考虑这方面的问题。
// 位置 mRectF.left = mCircleLineStrokeWidth / 2 ; mRectF.top = mCircleLineStrokeWidth / 2 ; mRectF.right = width - mCircleLineStrokeWidth / 2 ; mRectF.bottom = height - mCircleLineStrokeWidth / 2 ; );如果是圆的话,就是
canvas.drawCircle(width/2,width/2,width/2- mCircleLineStrokeWidth / 2,mBgPaint);