Paint画笔

2019-04-18  本文已影响0人  醉了俗身醒了初心

常用api

初始化

Paint mPaint = new Paint();

设置颜色

mPaint.setColor(Color.RED);

设置透明度, 范围0~255

mPaint.setAlpha(200);

抗锯齿

mPaint.setAntiAlias(true)

描边效果

//填充
mPaint.setStyle(Paint.Style.FILL);
//描边
mPaint.setStyle(Paint.Style.STROKE);
//描边并且填充
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);

效果图如下:


2019-04-18_100001.png

描边宽度

mPaint.setStrokeWidth(4);

圆角效果

//笔划以路径结束,并且不会超出它, 默认值
mPaint.setStrokeCap(Paint.Cap.Butt);
//在结束路径外, 添加圆角效果
mPaint.setStrokeCap(Paint.Cap.Round);
//笔划以方形投影,中心位于路径的末端
mPaint.setStrokeCap(Paint.Cap.SQUARE);
效果图如下 2019-04-18_100102.png

拐角风格

//斜接
mPaint.setStrokeJoin(Paint.Join.MITER);
// 斜角
mPaint.setStrokeJoin(Paint.Join.BEVEL);
//圆角
mPaint.setStrokeJoin(Paint.Join.ROUND);

如下图所示:


2019-04-18_101105.png

设置渲染器

渲染器分为5种, 下面会讲到
LinearGradient, RadialGradient, SweepGradient, BitmapShader, ComposeShader.

mPaint.setShader(new SweepGradient(200, 200, Color.BLUE, Color.RED, )

设置图层混合模式

mPaint.setXfermode(new PorterDuffXfermoode(PorterDuff.Mode.DARKEN));

设置颜色过滤器

mPaint.setColorFilter(new LightingColorFilter(0x00ffff, 0x000000))

设置双线性过滤

mPaint.setFilterBitmap(true);

设置画笔遮罩滤镜

mPaint.setMaskFilter(new BlurMaskFilter.Blur.NORMAL);

设置文本缩放倍数

mPaint.setTextScale(2)

设置字体大小

mPaint.setTextSize(38);

对齐方式

mPaint.setTextAlign(Paint.Align.LEFT);

设置下划线

mPaint.setUnderlineText(true);

测量文本大小, 将信息存放在rect中

String str = "Android 高级开发工程师";
Rect rect = new Rect();
mPaint.getTextBounds(str, 0, str.length(), rect);

获取文本的宽度

mPaint.measureText(str);

获取字体度量单位

mPaint.getFontMetrics();

字体的度量


2019-04-18_103031.png

颜色相关


2019-04-18_103246.png

线性渲染

构造方法:
LinearGradient(float x0, float y0, float x1, float y1,int color0, int color1, Shader.TileMode tile)
参数:
x0 y0 x1 y1: 渐变的两个端点的位置
color0 color1是端点的颜色
tile:端点范围之外的着色原则, 类型是TileMode
使用:

mShader = new LinearGradient(0, 0, 500, 500, new int[]{Color.RED, Color.BLUE}, null, Shader.TileMode.CLAMP);
mPaint.setShader(mShader);
canvas.drawCircle(250, 250, 250, mPaint);

环形渲染

构造方法:
RadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, TileMode tileMode)
参数:
centerX centerY:辐射中心的坐标
radius:辐射半径
centerColor:辐射中心颜色
edgeColor:辐射边缘的颜色
tileMode:辐射范围之外的着色规则, 类型是TileMode
使用:

mShader = new RadialGradient(250, 250, 250, new int[]{Color.GREEN, Color.YELLOW, Color.RED}, null, Shader.TileMode.CLAMP);
mPaint.setShader(mShader);
canvas.drawCircle(250, 250, 250, mPaint);

扫描渲染

构造方法:
SweepGradient(float cx, float cy, int color0, int color1);
参数:
cx cy:扫描的中心
color0:扫描的起始颜色
color:扫描的终止颜色
使用:

mShader = new SweepGradient(250, 250, Color.RED, Color.GREEN);
mPaint.setShader(mShader);
canvas.drawCircle(250, 250, 250, mPaint);

位图渲染

构造方法:
BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY);
参数:
bitmap:用来做模板的Bitmap对象
tileX:横向的着色规则, 类型是TileMode
titleY:纵向的着色规则, 类型是TileMode
使用:

mShader = new BitmapShader(mBitmap,Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
mPaint.setShader(mShader);
canvas.drawCircle(250, 250, 250, mPaint);

组合渲染

构造方法:
ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode);
参数:
shaderA, shaderB: 两个相继使用的Shader
mode:两个Shader的叠加模式, 即shaderA和shaderB应该怎样共同绘制。他的类型是PorterDuff.Mode
使用:

BitmapShader bitmapShader = new BitmapShader(mBitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
LinearGradient linearGradient = new LinearGradient(0, 0, 1000, 1600, new int[]{Color.RED, Color.GREEN, Color.BLUE}, null, Shader.TileMode.CLAMP);
mShader = new ComposeShader(bitmapShader, linearGradient, PorterDuff.Mode.MUTIPLY);
mPaint.setShader(mShader);![2019-04-18_115844.png](https://img.haomeiwen.com/i16225542/876f688003433166.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

canvas.drawCircle(250, 250, 250, mPaint);

图层混合模式
他将所绘制图形的像素与Canvas中对应位置的像素按照一定规则进行混合, 形成新的像素值, 从而更新Canvas中最终的像素颜色值。

18中模式


2019-04-18_115844.png
2019-04-18_212535.png

禁止硬件加速, 离屏绘制

通过使用离屏缓冲, 把要绘制的内容单独绘制在缓冲层, 保证Xfermode的使用,不会出现错误的结果。
使用离屏缓冲有两种方式:
Canvas.saveLayer();可以做短时的离屏缓冲, 在绘制之前保存, 绘制之后恢复:

int saveId = canvas.saveLayer(0, 0, width, height, Canvas.ALL_SAVE_FLAG);
Canvas.drawBitmap(rectBitmap, 0, 0, paint);//画方
paint.setXfermode(xfermode);
canvas.drawBitmap(circleBitmap, 0, 0, paint);//画园
paint.setXfermode(null);
canvas.restroreToCount(saveId);
//直接把整个view都绘制在离屏缓冲中
view.setLayerType();
//使用GPU缓冲
setLayerType(LAYER_TYPE_HARDWARE);
//使用一个bitmap来缓冲
setLayerType(LAYER_TYPE_SOFTWARE);



setLayerType(View.LAYER_TYPE_SOFTWARE , null);
//离屏绘制
int layerId = canvas.saveLayer(0, 0, getWidth(), getHeight(), mPaint, Canvas.ALL_SAVE_FLAG);
canvas.retoreToCount(layerId);

LightingColorFilter滤镜

LightingColorFilter
构造方法:
LightingColorFilter(int mul, int add)
参数:
mul和add都是和颜色值格式相同的int值, 其中mul用来和目标像素相乘, add用来和目标像素相加:
R' = Rmul.R/0xff + add.R
G' = G
mul.G/0xff+add.G
B' = B*mulj.B/0xff+add.B

使用:

ColorFilter lighting = new LightingColorFilter(0x00ffff, 0x000000);
paint.setColorFilter(lighting);
canvas.drawBitmap(bitmap, 0, 0, paint);

PorterDuffColorFilter滤镜

PorterDuffColorFilter
构造函数:
PorterDuffColorFilter(int color, PorterDuff.Mode mode)
参数:
color, 具体的颜色值, 例如Color.RED
mode, 指定PorterDuff.Mode混合模式
使用:

PorterDuffColorFilter porterDuffColorFilter = new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.DARKEN);
paint.setColorFilter(porterDuffColorFilter);
canvas.drawBitmap(mBitmap, 100, 0, paint);

ColorMatrixColorFilter滤镜

ColorMatrixColorFilter
构造方法:
ColorMatrixColorFilter(float[] colorMatrix);
参数:
colorMatrix矩阵数组
使用:

float[] colorMatrix = {
  1, 0, 0, 0, 0,
  0, 1, 0, 0, 0,
  0, 0, 1, 0, 0,
  0, 0, 0, 1, 0
};
mColorMatrixColorFilter = new ColorMatrixColorFilter(colorMatrix);
mPaint.setColorFilter(mColorMatrixColorFilter);
canvas.drawBitmap(mBitmap, 100, 0, mPaint);
上一篇下一篇

猜你喜欢

热点阅读