美文网首页
将全局坐标转为canvas坐标

将全局坐标转为canvas坐标

作者: chandarlee | 来源:发表于2016-11-21 17:32 被阅读204次
// ▼ 注意此处使用 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();
        }
        
        //返回结果
        coord[0] = (int) Math.round(pt[0]);
        coord[1] = (int) Math.round(pt[1]);
        return scale;
    }

相关文章

  • 将全局坐标转为canvas坐标

    **我们在画布上正常的绘制,需要将画布坐标系转换为全局坐标系后才能真正的绘制内容。所以我们反着来,将获得到的全局坐...

  • Canvas绘图基础

    Canvas坐标系和绘图坐标系 Canvas绘图中牵扯到两种坐标系:Canvas坐标系与绘图坐标系。 Canvas...

  • Android画布Canvas--save方法和saveLaye

    Canvas里面牵扯两种坐标系:Canvas自己的坐标系、绘图坐标系,当Canvas画布被创建时,Canvas的坐...

  • 读懂TSDF(Truncated Signed Distance

    1、获取体素在全局坐标系下的坐标(x,y,z),根据ICP配准得到的变换矩阵,将体素的坐标从全局坐标系转换到相机坐...

  • 无标题文章

    canvas 浏览器通过事件对象监听的鼠标坐标,是窗口坐标并不是相对于 Canvas 自身的坐标。大部分情况下,我...

  • Canvas save和restore方法

    在介绍这两个方法之前,需要先对Canvas的坐标了解。Canvas的坐标默认和屏幕的坐标系相同,如下图 在对Can...

  • 敢问Canvas来自何方

    Canvas的故事 来自一个群友的问题:使用Canvas绘制的时候坐标系是什么?是屏幕坐标系还是view坐标系?C...

  • 霍夫变换直线检测

    y = kx + bb = -kx + y 将 (x, y) 的坐标系转为系数 (k, b) 的坐标系一幅图像上多...

  • 超简单的canvas绘制地图

        本文使用geojson数据,通过缩放和平移把地图的地理坐标系转换canvas的屏幕坐标系,然后将转换后的数...

  • 在unity中实现鼠标拖动物体移动

    主要步骤 得到物体屏幕坐标的Z值 物体由世界坐标转为屏幕坐标 得到鼠标的世界坐标(Z值是物体的屏幕坐标) 鼠标三维...

网友评论

      本文标题:将全局坐标转为canvas坐标

      本文链接:https://www.haomeiwen.com/subject/otbupttx.html