欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Paint画笔

程序员文章站 2022-05-28 14:29:28
...

一、概念

画笔,保存了绘制几何图形、文本和位图的样式和颜色信息

二、常用API

通过ALT+7查看Paint类结构图,发现有大量的get、set方法。里面还存有很多的native方法, 实际上当我们调用Paint类中的方法时,实际上是间接调用了native方法。以setSubpixelText方法为例它就直接调用native方法nSetSubpixelText():

public void setSubpixelText(boolean subpixelText) {
    nSetSubpixelText(mNativePaint, subpixelText);
}

nSetSubpixelText()就是一个native方法:

@CriticalNative
private static native void nSetSubpixelText(long paintPtr, boolean subpixelText);

这需要我们掌握Paint类中常用的一些API方法:

mPaint = new Paint();//初始化
mPaint.setColor(Color.RED);//设置颜色
mPaint.setARGB(255,255,255,0);//设置paint对象颜色,范围0~255
mPaint.setAlpha(200);//设置alpha透明度,范围0~255
mPaint.setAntiAlias(true);//抗锯齿
mPaint.setStyle(Paint.Style.STROKE);//描边效果:FILL填充效果;STROKE:描边;FILL_AND_STROKE:同时作用
mPaint.setStrokeWidth(4);//描边宽度
mPaint.setStrokeCap(Paint.Cap.ROUND);//圆角效果:BUTT默认/ROUND圆角/SQUARE方角
mPaint.setStrokeJoin(Paint.Join.MITER);//拐角风格:MITER默认,尖角/ROUND/BEBEL切除尖角
mPaint.setShader(new SweepGradient(200,200,Color.BLUE,Color.RED));//设置环形渲染器,加上圆环效果
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DARKEN));//设置图层混合模式
mPaint.setColorFilter(new LightingColorFilter(0x00ffff,0x000000));//设置颜色过滤器
mPaint.setFilterBitmap(true);//设置双线性过滤
mPaint.setMaskFilter(new BlurMaskFilter(10,BlurMaskFilter.Blur.NORMAL));//设置画笔遮罩滤镜,传入度数和样式
mPaint.setTextScaleX(2);//设置文本缩放倍数
mPaint.setTextSize(38);//设置文字大小
mPaint.setTextAlign(Paint.Align.LEFT);//对其方式
mPaint.setUnderlineText(true);//设置下划线

String str="Android高级开发工程师";
Rect rect = new Rect();
mPaint.getTextBounds(str,0,str.length(),rect);//测量文本大小,将文本大小信息存放在rect中
mPaint.measureText(str);//获取文本的宽
mPaint.getFontMetrics();//获取文体度量对象
  • 1.setColor(int Color)参数具体的颜色纸,16进制数值,0xFFFF0000
  • 2.setARGB(int a,int r,int g,int b)参数:分别透明度、红、绿、蓝。0-255数值
  • 3.setShader(Shader shader)参数着色器对象,一般使用shader的几个子类
    • LinearGradient:线性渲染
    • RadialGradient:环形渲染
    • SweepGradient:扫描渲染
    • BitmapShader:位图渲染
    • ComposeShader:组合渲染,只能2个组合。例如LinearGradient+BitmapShader
  • 4.setColorFilter(ColorFilter colorFilter)设置颜色过滤。一般使用ColorFilter三个子类:
    • PorterDuffColorFilter:指定一个颜色和一种PorterDuff.Mode与绘制对象进行合成
    • ColorMatrixColorFilter:使用一个ColorMatrix来对颜色进行处理
    • LightingColorFilter光照效果

接下来重点看一下渲染器。

三、渲染器

3.1 LinearGradient线性渲染

构造方法:

public LinearGradient(float x0, float y0, float x1, float y1, @NonNull @ColorInt int colors[],
        @Nullable float positions[], @NonNull TileMode tile)	

参数:

  • (x0,y0):渐变起始点坐标
  • (x1,y1):渐变结束点坐标
  • color0:渐变开始点颜色,16进制的颜色表示,必须要带有透明度
  • color1:渐变结束颜色的颜色
  • colors:渐变数组
  • positions:浮点型数组,position的取值范围为【0,1】,作用是指定某个位置的颜色值。
  • title:用于指定控件区域大于指定的渐变区域时,空白区域的颜色填充方法。端点范围之外的着色规则,类型是TitleMode

对于position,new float[]{0.5f,1} 影响了渐变的效果,是相对位置。即50%~100%才开始渐变 。可为null,null就表示渐变为线性变化:

//如果positions不为空且其长度与颜色长度不相等,就抛出异常
if (positions != null && colors.length != positions.length) {
    throw new IllegalArgumentException("color and position arrays must be of equal length");
} 

使用:

		mBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
        mPaint = new Paint();//初始化
        mPaint.setAntiAlias(true);//抗锯齿
        mPaint.setStyle(Paint.Style.FILL);
        //1.线性渲染
        mShader = new LinearGradient(0,0,500,500,new int[]{Color.RED,Color.BLUE},new float[]{0.5f,1}, Shader.TileMode.CLAMP);
        mPaint.setShader(mShader);
        canvas.drawCircle(250,250,250,mPaint);

效果:

由红向蓝渐变,如果圆不明显,可以改成矩形
Paint画笔

3.2 环形渲染RadialGradient

构造方法:

public RadialGradient(float centerX, float centerY, float radius,
        @NonNull @ColorInt int colors[], @Nullable float stops[],
        @NonNull TileMode tileMode)

参数:

  • centerX,CenterY:辐射中心的坐标
  • radius:辐射半径
  • centerColor:辐射中心的颜色
  • edgeColor:辐射边缘的颜色
  • colors:渐变颜色数组
  • stops:渐变位置数组,类似扫描渐变的position数组,取值【0,1】中心点为0,半径到达位置为1.0f
  • tileMode:辐射范围之外的着色规则,类型是TileMode。shader表示未覆盖以外的 填充方式

使用:

		//2.环形渲染
        mPaint.setShader(new RadialGradient(250,250,500,new int[]{Color.RED,Color.BLUE,Color.YELLOW},null, Shader.TileMode.CLAMP));
        canvas.drawCircle(250,250,250,mPaint);

效果:

由圆心开始向外环形渲染
Paint画笔

3.3 扫描渲染SweepGradient

构造方法:

public SweepGradient(float cx, float cy, @ColorInt int color0, @ColorInt int color1)

参数:

  • cx,cy:扫描的中心
  • color0:扫描的起始位置
  • color1:扫描的终止位置

使用:

		//3.扫描渲染
        mPaint.setShader(new SweepGradient(250,250,Color.RED,Color.BLUE));
        canvas.drawCircle(250,250,250,mPaint);

效果:

从x轴正方向,沿着顺时针方向选择360°
Paint画笔

3.4 位图渲染BitmapShader

构造方法:

public BitmapShader(@NonNull Bitmap bitmap, @NonNull TileMode tileX, @NonNull TileMode tileY)

参数:

  • bitmap:用来做模板的Bitmap对象
  • tileX:X轴方向的着色规则,类型是TileMode
  • tileY:Y轴方向的着色规则,类型是TileMode

使用:

		//4.位图渲染
        mPaint.setShader(new BitmapShader(mBitmap,Shader.TileMode.CLAMP,Shader.TileMode.CLAMP));
//        canvas.drawRect(0,0,mBitmap.getWidth(),mBitmap.getHeight(),mPaint);
        canvas.drawCircle(250,250,250,mPaint);

效果:
在水平、垂直方向的最后一个像素,有一个拉伸填充效果。这个效果源自参数TileMode:

  • CLAMP 当绘制的区域超出图片自身的区域,会以最后一个像素进行拉伸、填充
  • REPEAT 绘制区域超出渲染区域的部分,重复排版–平铺效果,也就是copy
  • MIRROR 绘制区域超出渲染区域的部分,镜像填充

3.5 组合渲染ComposeShader

构造方法:

public ComposeShader(@NonNull Shader shaderA, @NonNull Shader shaderB,
        @NonNull PorterDuff.Mode mode)
        
public ComposeShader(@NonNull Shader shaderA, @NonNull Shader shaderB, @NonNull Xfermode mode)

参数:

  • shaderA,shaderB:要混合的两种shader
  • xfermode mode:组合两种shader颜色的模式
  • porterDuff.Mode mode:组合两种shader颜色的模式

使用:

		//5.组合渲染
        mPaint.setShader(new ComposeShader(new BitmapShader(mBitmap,Shader.TileMode.REPEAT,Shader.TileMode.REPEAT),
                new LinearGradient(0,0,1000,1600,new int[]{Color.RED,Color.GREEN,Color.BLUE},null,Shader.TileMode.CLAMP),
                PorterDuff.Mode.MULTIPLY ));
        canvas.drawCircle(250,250,250,mPaint);

效果:

绘制区域远大于位图,重复排版,同时线性渲染也加持了。
PorterDuff.Mode.MULTIPLY:两个渲染器进行渲染的图层混合规则

相关标签: Paint画笔

上一篇: 画笔 QPen

下一篇: java--类型擦除