美文网首页
Paint画笔

Paint画笔

作者: 醉了俗身醒了初心 | 来源:发表于2019-04-18 21:43 被阅读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);
    

    相关文章

      网友评论

          本文标题:Paint画笔

          本文链接:https://www.haomeiwen.com/subject/guxzwqtx.html