将全局坐标转为canvas坐标

// ▼ 注意此处使用 getRawX,而不是 getX
down_x = event.getRawX();
down_y = event.getRawY();
// -------------------------------------
// ▼ 获得当前矩阵的逆矩阵
Matrix invertMatrix = new Matrix();
canvas.getMatrix().invert(invertMatrix);
// ▼ 使用 mapPoints 将触摸位置转换为画布坐标
invertMatrix.mapPoints(pts);
  private void matrixOps(){
        Matrix matrix = new Matrix();//{1.0, 0, 0}, {0, 1.0, 0}, {0, 0, 1.0}
        float[] orgPts = new float[]{50, 50};
        float[] dstPts = new float[2];
        matrix.mapPoints(dstPts, orgPts); //dst = (50, 50)
        matrix.setTranslate(10, 10); //{1.0, 0, 10}, {0, 1.0, 10}, {0, 0, 1.0}
        matrix.mapPoints(dstPts, orgPts); //dst = (60, 60)
        Matrix invert = new Matrix();
        matrix.invert(invert); // invert = {1.0, 0, -10}, {0, 1.0, -10}, {0, 0, 1.0}
        invert.mapPoints(dstPts, orgPts); //dst = (40, 40)

**我们在画布上正常的绘制,需要将画布坐标系转换为全局坐标系后才能真正的绘制内容。所以我们反着来,将获得到的全局坐标系坐标使用当前画布的逆矩阵转化一下,就转化为当前画布的坐标系坐标了,详情 Matrix原理Matrix详解 **

将子View坐标转为父View坐标

* @param descendant 子View * @param coord 子View中的某点的坐标,同时该方法返回时coord转换为在最顶层ParentView坐标系下的坐标 * @return 返回descendant相对于顶层ParentView的缩放值 public float getDescendantCoordRelativeToSelf(View descendant, int[] coord) { float scale = 1.0f; //(coord[0],coord[1])分别是子View中所要转换的点的(x,y)坐标 float[] pt = {coord[0], coord[1]}; //子View由于旋转缩放等操作改变了子View的坐标系,这些变化反映在子View对应的Matrix上, //getMatrix()方法获得子View的Matrix。而mapPoints方法则可以得到在初始的坐标系下pt点的坐标 descendant.getMatrix().mapPoints(pt); //计算子View x轴的缩放值 scale *= descendant.getScaleX(); //在对子View变换时,子View的Left,Right,Top,Bottom是不变的 //变化的仅仅是translate rotation等其他对应的属性,通过view.getMatrix可以拿到代表这些变化的矩阵 //因此下面两行可以计算出descendant中的点在其父View坐标系下的坐标 pt[0] += descendant.getLeft(); pt[1] += descendant.getTop(); //通过下面的循环,递归的一层一层计算出descendant中的点在最顶层View也就是DragLayer坐标系下的坐标值 //和x轴的总的缩放值 ViewParent viewParent = descendant.getParent(); while (viewParent instanceof View && viewParent != this) { final View view = (View)viewParent; view.getMatrix().mapPoints(pt); scale *= view.getScaleX(); pt[0] += view.getLeft() - view.getScrollX(); pt[1] += view.getTop() - view.getScrollY(); viewParent = view.getParent(); //返回结果