將全局坐標轉(zhuǎn)為canvas坐標

// ▼ 注意此處使用 getRawX,而不是 getX
down_x = event.getRawX();
down_y = event.getRawY();

// -------------------------------------

// ▼ 獲得當前矩陣的逆矩陣
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)容。所以我們反著來,將獲得到的全局坐標系坐標使用當前畫布的逆矩陣轉(zhuǎn)化一下,就轉(zhuǎn)化為當前畫布的坐標系坐標了,詳情 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對應的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();
        
        //通過下面的循環(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;
    }
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容