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。
     
     
     





  • 相关阅读:
    20155322 2016-2017-2 《Java程序设计》第7周学习总结
    高级sed编程
    正则表达式
    实验十二:kvm环境下qemu-kvm创建虚拟机之间的网络配置
    实验十一:了解qemu-kvm的显示选项参数
    实验十:在kvm下创建winxp虚拟机
    实验九:第二个虚拟机的创建(标准选项)
    实验八:kvm环境搭建并创建第一台cirrOS虚拟机
    sed和gawk
    在脚本中添加颜色
  • 原文地址:https://www.cnblogs.com/platte/p/3534279.html
Copyright © 2011-2022 走看看