在Android中將子View的座標轉換爲父View的座標

在Android中,我們有時候可能會將子View的座標轉換爲父View中的座標。
在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。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章