在Launcher中有這麼一段代碼可以完成這項工作。
public float getDescendantCoordRelativeToSelf(View descendant, int[] coord) {
float scale = 1.0f;
float[] pt = {coord[0], coord[1]};
//座標值進行當前窗口的矩陣映射,比如View進行了旋轉之類,
//它的座標系會發生改變。map之後,會把點轉換爲改變之前的座標。這個地方很關鍵
descendant.getMatrix().mapPoints(pt);
//轉換爲直接父窗口的座標
scale *= descendant.getScaleX();
pt[0] += descendant.getLeft();
pt[1] += descendant.getTop();
ViewParent viewParent = descendant.getParent();
//循環獲得父窗口的父窗口,並且依次計算在每個父窗口中的座標
while (viewParent instanceof View && viewParent != this) {
final View view = (View) viewParent;
view.getMatrix().mapPoints(pt);
scale *= view.getScaleX();//這個是計算X的縮放值。此處可以不管
//轉換爲相當於可視區左上角的座標,scrollX,scollY是去掉滾動的影響
pt[0] += view.getLeft() - view.getScrollX();
pt[1] += view.getTop() - view.getScrollY();
viewParent = view.getParent();
}
coord[0] = (int) Math.round(pt[0]);
coord[1] = (int) Math.round(pt[1]);
return scale;
}其中,descendant 是子View,coord是在descendant中的座標值。而這個函數是父View的函數。當然,我們可以可以加一個
參數,指定父View。