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。
     
     
     





  • 相关阅读:
    将Web项目War包部署到Tomcat服务器基本步骤(完整版)
    性能实战分析-环境搭建(一)
    SQL Server Profiler追踪数据库死锁
    性能测试的各种监控工具大全
    python学习
    Linux常见面试题一
    Linux下用于查看系统当前登录用户信息的4种方法
    HDU 1394 Minimum Inversion Number(线段树求逆序对)
    SGU 180 Inversions(离散化 + 线段树求逆序对)
    Codeforces Round #FF (Div. 2) C. DZY Loves Sequences
  • 原文地址:https://www.cnblogs.com/platte/p/3534279.html
Copyright © 2011-2022 走看看