zoukankan      html  css  js  c++  java
  • 在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。
     
     
     





  • 相关阅读:
    bzoj1202 狡猾的商人
    bzoj1059 矩阵游戏
    bzoj1003 物流运输
    bzoj1601 灌水
    2017-10-25模拟赛
    洛谷—— P1051 谁拿了最多奖学金
    BZOJ——1611: [Usaco2008 Feb]Meteor Shower流星雨
    2017-10-23学大伟业Day1
    BZOJ——1610: [Usaco2008 Feb]Line连线游戏
    Vijos 包裹快递(二分)
  • 原文地址:https://www.cnblogs.com/platte/p/3534279.html
Copyright © 2011-2022 走看看