ps:本文并不长于详细讲解 paint ,只在于记录常用的 API 和设置
详细讲解 paint 的技术文章请看:
paint 常用 API :
// 设置颜色
paint.setColor(int color)
// color 的取值
Color.RED
Color.rgb(255,100,100)
Color.argb(50,255,100,100)
getResources().getColor(android.R.color.holo_blue_bright)
// 参数 alpha 透明度
paint.setAlpha(int a)
// 设置抗锯齿
paint.setAntiAlias(boolean aa)
// 设置文本缩放倍数
paint.setTextScaleX(float scaleX)
// 设置字符之间的间距
paint.setLetterSpacing(float size)
// 设置字体大小
paint.setTextSize(float textSize)
// 设置下划线
paint.setUnderlineText(true)
// 设置文本删除线
paint.setStrikeThruText(true);
// 设置画笔的粗细
paint.setStrokeWidth(10);
下面我们来说说本文重点吧,paint 的特性
Style 填充模式
API:
mPaint.setStyle(Paint.Style.FILL);
paint 的 Style 有3种:
- STROKE - 描边
- FILL - 填充
- FILL_AND_STROKE - 描边加填充
做个演示看的清楚
Paint paint = new Paint();
paint.setColor(Color.BLUE);
paint.setStrokeWidth(40); //为了实验效果明显,特地设置描边宽度非常大
// 描边
paint.setStyle(Paint.Style.STROKE);
canvas.drawCircle(200,200,100,paint);
// 填充
paint.setStyle(Paint.Style.FILL);
canvas.drawCircle(200,500,100,paint);
// 描边加填充
paint.setStyle(Paint.Style.FILL_AND_STROKE);
canvas.drawCircle(200, 800, 100, paint);
StrokeCap 字帽
啥叫字帽,简单来说就是画一条线,左边和右边起始点的样式
API:
paint.setStrokeCap(Paint.Cap.BUTT);
StrokeCap 字帽有3种:
- BUTT - 无线冒
- ROUND - 圆形线冒
- SQUARE - 方形线冒
跑个例子看看:
private void drawStrokeCap(Canvas canvas) {
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setStrokeWidth(200);
paint.setColor(Color.parseColor("#00ff00"));
// 线帽,即画的线条两端是否带有圆角,butt,无圆角
paint.setStrokeCap(Paint.Cap.BUTT);
canvas.drawLine(200, 200, 500, 200, paint);
paint.setColor(Color.parseColor("#ff0000"));
// 线帽,即画的线条两端是否带有圆角,ROUND,圆角
paint.setStrokeCap(Paint.Cap.ROUND);
canvas.drawLine(200, 500, 500, 500, paint);
paint.setColor(Color.parseColor("#0000ff"));
// 线帽,即画的线条两端是否带有圆角,SQUARE,矩形
paint.setStrokeCap(Paint.Cap.SQUARE);
canvas.drawLine(200, 800, 500, 800, paint);
}
StrokeJoin 折线样式
折线样式,简单说就是线段折叠处的处理样式
API:
paint.setStrokeJoin(Paint.Join.MITER);
StrokeJoin 折线样式有3种:
- Paint.Join.MITER - 结合处为锐角
- Paint.Join.Round - 结合处为圆弧
- Paint.Join.BEVEL - 结合处为直线
跑个例子看看:
Paint paint = new Paint();
paint.setAntiAlias( true );
paint.setStrokeWidth( 80 );
paint.setStyle(Paint.Style.STROKE ); // 默认是填充 Paint.Style.FILL
paint.setColor( Color.parseColor("#0000ff") );
Path path = new Path();
path.moveTo(100, 100);
path.lineTo(400, 100);
path.lineTo(100, 300);
paint.setStrokeJoin(Paint.Join.MITER);
canvas.drawPath(path, paint);
path.moveTo(100, 500);
path.lineTo(400, 500);
path.lineTo(100, 700);
paint.setStrokeJoin(Paint.Join.ROUND);
canvas.drawPath(path, paint);
path.moveTo(100, 900);
path.lineTo(400, 900);
path.lineTo(100, 1100);
paint.setStrokeJoin(Paint.Join.BEVEL);
canvas.drawPath(path, paint);
难点
除了上述内容外,paint 还有一些很难懂的,很理论的东西:
- ColorMatrix 颜色滤镜
颜色滤镜可以实现许多图片处理的效果,详细请看这个:
- BlurMaskFilter和EmbossMaskFilter
前者为模糊遮罩滤镜,而后者为浮雕遮罩滤镜,BlurMaskFilter 可以实现比阴影 API 更丰富的效果,具体请看:
- PorterDuffXfermode
这个是图层操作,应用也是非常广的,简单的画有图片底纹的文字可以看:
这个也只是简单的例子,更复杂的还是要我们去仔细看