画笔Paint

一、Paint的基本实用方法和技巧
1 .负责图形绘制相关

    //重置
    mPaint.reset();
    mPaint.setColor(Color.RED);
    mPaint.setAlpha(255);
    //设置画笔的样式
//  mPaint.setStyle(Paint.Style.FILL);//填充内容
//  mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
    mPaint.setStyle(Paint.Style.STROKE);//描边
    //画笔的宽度
    mPaint.setStrokeWidth(50);
    //线帽
//  mPaint.setStrokeCap(Paint.Cap.BUTT);//没有
    mPaint.setStrokeCap(Paint.Cap.ROUND);//圆形
//  mPaint.setStrokeCap(Paint.Cap.SQUARE);//方形

//  mPaint.setStrokeJoin(Paint.Join.MITER);//锐角
//  mPaint.setStrokeJoin(Paint.Join.ROUND);//圆弧
//  mPaint.setStrokeJoin(Paint.Join.BEVEL);//直线
    //线段的连接处的样式
//  mPaint.setStrokeJoin(Paint.Join.MITER);//锐角
//  mPaint.setStrokeJoin(Paint.Join.ROUND);//圆弧
//  mPaint.setStrokeJoin(Paint.Join.BEVEL);//直线

//防锯齿,会损失一定的性能
mPaint.setAntiAlias(true);

2 .负责文字绘制相关

//获得字符行间距
//  mPaint.getFontSpacing();
    //获得字符之间的间距
//  mPaint.getLetterSpacing();
//  mPaint.setLetterSpacing(letterSpacing)//设置
    //设置文本删除线
//  mPaint.setStrikeThruText(true);
    //是否设置下划线
//  mPaint.setUnderlineText(true);
    //设置文本大小
//  mPaint.setTextSize(textSize);
//  mPaint.getTextSize();
//  mPaint.setTypeface(Typeface.BOLD);//设置字体类型
//  Typeface.ITALIC
//  Typeface.create(familyName, style)//加载自定义字体
    //文字倾斜 默认0,官方推荐的-0.25f是斜体
//  mPaint.setTextSkewX(-0.25f);
    //文本对齐方式
//  mPaint.setTextAlign(Align.LEFT);
//  mPaint.setTextAlign(Align.CENTER);
//  mPaint.setTextAlign(Align.RIGHT);
//计算制定长度的字符串(字符长度、字符个数、显示的时候真实的长度)
//  int breadText = mPaint.breakText(text, measureForwards, maxWidth, measuredWidth)
    mPaint.setTextSize(50);
//  float[] measuredWidth = new float[1];
//  int breakText = mPaint.breakText(str, true, 200, measuredWidth);
//  Log.i("RICKY", "breakText="+breakText+", str.length()="+str.length()+", measredWidth:"+measuredWidth[0]);
// Rect bounds获取文本的矩形区域(宽高)
//  mPaint.getTextBounds(text, index, count, bounds)
//  mPaint.getTextBounds(text, start, end, bounds)
    //获取文本的宽度,和上面类似,但是是一个比较粗略的结果
    float measureText = mPaint.measureText(str);
    //获取文本的宽度,和上面类似,但是是比较精准的。
    float[] measuredWidth = new float[10];  
    //measuredWidth得到每一个字符的宽度;textWidths字符数
    int textWidths = mPaint.getTextWidths(str, measuredWidth);
//  mPaint.getTextWidths(text, start, end, widths)
    Log.i("RICKY", "measureText:"+measureText+", textWidths:"+textWidths);

3.基线的问题
这里写图片描述

FontMetrics fontMetrics = mPaint.getFontMetrics();
fontMetrics.top;
fontMetrics.ascent;
fontMetrics.descent;
fontMetrics.bottom;

所有的四个值都是以基线baseLine为基准来计算的。baseline以上的就是负的;以下的是正的。

在做自定义控件的时候canvas.drawText(x,y) 这个y并不是text的左上角,而是以baseline为基准的。

1)实例:指定左上角的顶点坐标 绘制文本
公式: float baselineY = Y - fontMetrics.top;

2)实例:指定中间位置,绘制文本
公式: float baselineY = centerY + (fontMetrics.bottom-fontMetrics.top)/2 - fontMetrics.bottom

4.Paint画笔的高级技能
渲染 Shader:
BimapShader位图的图像渲染器
LinearGradient线性渲染
RadialGradient环形渲染
水波纹效果,充电水波纹扩散效果、调色板
SweepGradient梯度渲染(扫描渲染)
微信等雷达扫描效果。手机卫士垃圾扫描
ComposeShader组合渲染

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawColor(Color.WHITE);

//      canvas.drawBitmap(bitmap, 0, 0, paint);

        /**
         * TileMode.CLAMP 拉伸最后一个像素去铺满剩下的地方
         * TileMode.MIRROR 通过镜像翻转铺满剩下的地方。
         * TileMode.REPEAT 重复图片平铺整个画面(电脑设置壁纸)
         */
//      bitmapShader = new BitmapShader(bitmap, TileMode.CLAMP, TileMode.MIRROR);
//      bitmapShader = new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP);
        bitmapShader = new BitmapShader(bitmap, TileMode.REPEAT, TileMode.REPEAT);
        paint.setShader(bitmapShader);
//      paint.setAntiAlias(true);

        //设置像素矩阵,来调整大小,为了解决宽高不一致的问题。
//      float scale = Math.max(width, height)*1.0f/Math.min(width, height);
//      Matrix matrix = new Matrix();
//      matrix.setScale(scale, scale);//缩放比例
//      bitmapShader.setLocalMatrix(matrix);

//      canvas.drawRect(new Rect(0, 0, 800, 800), paint);
//      canvas.drawCircle(height/2, height/2, height/2, paint);
//      canvas.drawCircle(Math.min(width, height)/2f, scale*Math.max(width, height)/2f, Math.max(width, height)/2f, paint);

//      canvas.drawOval(new RectF(0, 0, width, height), paint);
//      canvas.drawOval(new RectF(0, 0, width, width), paint);

        //通过shapeDrawable也可以实现
//      ShapeDrawable shapeDrawable = new ShapeDrawable(new OvalShape());
//      shapeDrawable.getPaint().setShader(bitmapShader);
//      shapeDrawable.setBounds(0, 0, width, width);
//      shapeDrawable.draw(canvas);


        /**线性渐变
         * x0, y0, 起始点
         *  x1, y1, 结束点
         * int[]  colors, 中间依次要出现的几个颜色
         * float[] positions,数组大小跟colors数组一样大,中间依次摆放的几个颜色分别放置在那个位置上(参考比例从左往右)
         *    tile
         */
//      LinearGradient linearGradient = new LinearGradient(0, 0, 400, 400, colors, null, TileMode.CLAMP);
        LinearGradient linearGradient = new LinearGradient(0, 0, 400, 400, colors, null, TileMode.REPEAT);
//      paint.setShader(linearGradient);
//      canvas.drawRect(0, 0, 400, 400, paint);

//      radialGradient = new RadialGradient(300, 300, 100, colors, null, TileMode.REPEAT);
//      paint.setShader(radialGradient);
//      canvas.drawCircle(300, 300, 300, paint);

//      sweepGradient = new SweepGradient(300, 300, colors, null);
//      paint.setShader(sweepGradient);
//      canvas.drawCircle(300, 300, 300, paint);

        composeShader = new ComposeShader(linearGradient, bitmapShader, PorterDuff.Mode.SRC_OVER);
        paint.setShader(composeShader);
        canvas.drawRect(0, 0, 800, 1000, paint);

    }

可以绘制图片、颜色块、文字
canvas.drawCircle()
canvas.drawRect()
canvas.drawOval()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值