// ▼ 注意此處使用 getRawX,而不是 getX
down_x = event.getRawX();
down_y = event.getRawY();
// -------------------------------------
// ▼ 獲得當(dāng)前矩陣的逆矩陣
Matrix invertMatrix = new Matrix();
canvas.getMatrix().invert(invertMatrix);
// ▼ 使用 mapPoints 將觸摸位置轉(zhuǎn)換為畫布坐標
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)
}
**我們在畫布上正常的繪制撞蜂,需要將畫布坐標系轉(zhuǎn)換為全局坐標系后才能真正的繪制內(nèi)容。所以我們反著來侥袜,將獲得到的全局坐標系坐標使用當(dāng)前畫布的逆矩陣轉(zhuǎn)化一下蝌诡,就轉(zhuǎn)化為當(dāng)前畫布的坐標系坐標了,詳情 Matrix原理 和 Matrix詳解 **
將子View坐標轉(zhuǎn)為父View坐標
/**
*
* @param descendant 子View
* @param coord 子View中的某點的坐標枫吧,同時該方法返回時coord轉(zhuǎn)換為在最頂層ParentView坐標系下的坐標
* @return 返回descendant相對于頂層ParentView的縮放值
*/
public float getDescendantCoordRelativeToSelf(View descendant, int[] coord) {
float scale = 1.0f;
//(coord[0],coord[1])分別是子View中所要轉(zhuǎn)換的點的(x,y)坐標
float[] pt = {coord[0], coord[1]};
//子View由于旋轉(zhuǎn)縮放等操作改變了子View的坐標系浦旱,這些變化反映在子View對應(yīng)的Matrix上,
//getMatrix()方法獲得子View的Matrix九杂。而mapPoints方法則可以得到在初始的坐標系下pt點的坐標
descendant.getMatrix().mapPoints(pt);
//計算子View x軸的縮放值
scale *= descendant.getScaleX();
//在對子View變換時颁湖,子View的Left,Right例隆,Top甥捺,Bottom是不變的
//變化的僅僅是translate rotation等其他對應(yīng)的屬性,通過view.getMatrix可以拿到代表這些變化的矩陣
//因此下面兩行可以計算出descendant中的點在其父View坐標系下的坐標
pt[0] += descendant.getLeft();
pt[1] += descendant.getTop();
//通過下面的循環(huán)裳擎,遞歸的一層一層計算出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();
}
//返回結(jié)果
coord[0] = (int) Math.round(pt[0]);
coord[1] = (int) Math.round(pt[1]);
return scale;
}