您当前的位置: 首页 >  android

Kevin-Dev

暂无认证

  • 0浏览

    0关注

    544博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Android 自定义 View】测量过程(Measure)

Kevin-Dev 发布时间:2020-01-07 22:13:33 ,浏览量:0

文章目录
    • 简介
    • Path 使用方法详解
      • 1. moveTo、 setLastPoint、 lineTo 和 close
      • 2. addXxx与arcTo
      • 3. Path
      • 4. addArc与arcTo
      • 5. isEmpty、 isRect、isConvex、 set 和 offset
    • 练手项目 -- 雷达图

简介

本文会了解到 path (路径)这个 Canvas 中的神器,有了这个神器,就能创造出更多炫酷的东东。

使用 Path 不仅能够绘制简单图形,也可以绘制这些比较复杂的图形。另外,根据路径绘制文本和剪裁画布都会用到 Path

常用方法 在这里插入图片描述 在这里插入图片描述

Path 使用方法详解 1. moveTo、 setLastPoint、 lineTo 和 close

首先创建画笔:

Paint mPaint = new Paint();             // 创建画笔
mPaint.setColor(Color.BLACK);           // 画笔颜色 - 黑色
mPaint.setStyle(Paint.Style.STROKE);    // 填充模式 - 描边
mPaint.setStrokeWidth(10);              // 边框宽度 - 10
  • lineTo public void lineTo (float x, float y) lineTo 很简单,只有一个方法,作用也很容易理解,就是一条线。
canvas.translate(mWidth / 2, mHeight / 2);  // 移动坐标系到屏幕中心(宽高数据在onSizeChanged中获取)

Path path = new Path();                     // 创建Path

path.lineTo(200, 200);                      // lineTo
path.lineTo(200,0);

canvas.drawPath(path, mPaint);              // 绘制Path

在这里插入图片描述

第一次由于之前没有过操作,所以默认点就是坐标原点O,结果就是坐标原点O到A(200,200)之间连直线(用蓝色圈1标注)。

第二次lineTo的时候,由于上次的结束位置是A(200,200),所以就是A(200,200)到B(200,0)之间的连线(用蓝色圈2标注)。

  • moveTo 方法预览
// moveTo
public void moveTo (float x, float y)

示例

canvas.translate(mWidth / 2, mHeight / 2);  // 移动坐标系到屏幕中心

Path path = new Path();                     // 创建Path

path.lineTo(200, 200);                      // lineTo

path.moveTo(200,100);                       // moveTo

path.lineTo(200,0);                         // lineTo

canvas.drawPath(path, mPaint);              // 绘制Path

在这里插入图片描述

moveTo 只改变下次操作的起点,在执行完第一次 LineTo 的时候,本来的默认点位置是A(200,200),但是 moveTo将其改变成为了C(200,100),所以在第二次调用 lineTo 的时候就是连接C(200,100) 到 B(200,0)之间的直线(用蓝色圈2标注)。

  • setLastPoint 方法预览:
// setLastPoint
public void setLastPoint (float dx, float dy)

示例

canvas.translate(mWidth / 2, mHeight / 2);  // 移动坐标系到屏幕中心

Path path = new Path();                     // 创建Path

path.lineTo(200, 200);                      // lineTo

path.setLastPoint(200,100);                 // setLastPoint

path.lineTo(200,0);                         // lineTo

canvas.drawPath(path, mPaint);              // 绘制Path

在这里插入图片描述

setLastPoint 是重置上一次操作的最后一个点,在执行完第一次的lineTo的时候,最后一个点是A(200,200),而 setLastPoint 更改最后一个点为C(200,100),所以在实际执行的时候,第一次的lineTo就不是从原点O到A(200,200)的连线了,而变成了从原点O到C(200,100)之间的连线了。 在执行完第一次 lineTo 和 setLastPoint后,最后一个点的位置是C(200,100),所以在第二次调用lineTo的时候就是C(200,100) 到 B(200,0)之间的连线(用蓝色圈2标注)。

  • close 方法预览
public void close ()

close方法用于连接当前最后一个点和最初的一个点(如果两个点不重合的话),最终形成一个封闭的图形。

canvas.translate(mWidth / 2, mHeight / 2);  // 移动坐标系到屏幕中心

Path path = new Path();                     // 创建Path

path.lineTo(200, 200);                      // lineTo

path.lineTo(200,0);                         // lineTo

path.close();                               // close

canvas.drawPath(path, mPaint);              // 绘制Path

在这里插入图片描述 注意:close的作用是封闭路径,与连接当前最后一个点和第一个点并不等价。如果连接了最后一个点和第一个点仍然无法形成封闭图形,则close什么 也不做。

2. addXxx与arcTo
  • 基本形状 方法预览
// 圆形
public void addCircle (float x, float y, float radius, Path.Direction dir)
// 椭圆
public void addOval (RectF oval, Path.Direction dir)
// 矩形
public void addRect (float left, float top, float right, float bottom, Path.Direction dir)
public void addRect (RectF rect, Path.Direction dir)
// 圆角矩形
public void addRoundRect (RectF rect, float[] radii, Path.Direction dir)
public void addRoundRect (RectF rect, float rx, float ry, Path.Direction dir)

Path.Direction : 方向,趋势。 在这里插入图片描述 示例

canvas.translate(mWidth / 2, mHeight / 2);  // 移动坐标系到屏幕中心

Path path = new Path();

path.addRect(-200,-200,200,200, Path.Direction.CCW);

path.setLastPoint(-300,300);                //             
关注
打赏
1658837700
查看更多评论
0.1049s