在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。