Что такое андроидный эквивалент функций UIView convertRect/convertPoint?
UIView имеет следующее:
- convertPoint:toView:
- convertPoint:fromView:
- convertRect:toView:
- convertRect:fromView:
Что такое Android-эквивалент? В более общем плане, учитывая два View
s, как получить второй View
rect в системе координат первого?
Ответы
Ответ 1
Я не думаю, что есть эквивалент как часть sdk, но похоже, что вы могли легко написать свою собственную реализацию с помощью getLocationOnScreen
:
public static Point convertPoint(Point fromPoint, View fromView, View toView){
int[] fromCoord = new int[2];
int[] toCoord = new int[2];
fromView.getLocationOnScreen(fromCoord);
toView.getLocationOnScreen(toCoord);
Point toPoint = new Point(fromCoord[0] - toCoord[0] + fromPoint.x,
fromCoord[1] - toCoord[1] + fromPoint.y);
return toPoint;
}
public static Rect convertRect(Rect fromRect, View fromView, View toView){
int[] fromCoord = new int[2];
int[] toCoord = new int[2];
fromView.getLocationOnScreen(fromCoord);
toView.getLocationOnScreen(toCoord);
int xShift = fromCoord[0] - toCoord[0];
int yShift = fromCoord[1] - toCoord[1];
Rect toRect = new Rect(fromRect.left + xShift, fromRect.top + yShift,
fromRect.right + xShift, fromRect.bottom + yShift);
return toRect;
}
Ответ 2
В Android у него может не быть метода, который точно такой же
однако вы можете сделать
View.getLocationOnScreen(int[] location)
и View.getLocationInWindowint[] location()
которые
getLocationOnScreen (int [] location)
Вычисляет координаты этого представления в его окно.
getLocationInWindow (int [] location)
Вычисляет координаты этого представления по экрана.
или View.getLeft() и View.getTop()
которые
getLeft()
Левое положение этого представления относительно его родителя.
getTop()
Верхнее положение этого представления относительно его родителя.
для вас, я бы использовал getLeft() и getTop(), чтобы найти это пространство между 2 View и получить его диапазон
ссылка содержит пример того, как ее найти, используя getLeft() и getTop()
private int getRelativeLeft(View myView) {
if (myView.getParent() == myView.getRootView())
return myView.getLeft();
else
return myView.getLeft() + getRelativeLeft((View) myView.getParent());
}
private int getRelativeTop(View myView) {
if (myView.getParent() == myView.getRootView())
return myView.getTop();
else
return myView.getTop() + getRelativeTop((View) myView.getParent());
}
Ответ 3
Способ сделать это с помощью getGlobalVisibleRect (Rect r, Point globalOffset).
/**
* If some part of this view is not clipped by any of its parents, then
* return that area in r in global (root) coordinates. To convert r to local
* coordinates (without taking possible View rotations into account), offset
* it by -globalOffset (e.g. r.offset(-globalOffset.x, -globalOffset.y)).
* If the view is completely clipped or translated out, return false.
*
* @param r If true is returned, r holds the global coordinates of the
* visible portion of this view.
* @param globalOffset If true is returned, globalOffset holds the dx,dy
* between this view and its root. globalOffet may be null.
* @return true if r is non-empty (i.e. part of the view is visible at the
* root level.
*/
Итак, вы даете ему Point
и получаете смещение относительно корня View
. Они заключаются в том, что ваши представления получают местоположение относительно общего элемента. Затем вы можете использовать это смещение для вычисления относительных позиций. Док говорит, чтобы получить локальные координаты, вы компенсировали Rect
с -globalOffset. Если вы хотите получить второй вид Rect
в координатах первого, затем смещайте Rect
первого вида с -globalOffset второго представления.
Аналогично, вы можете использовать globalOffset
для преобразования точки в относительные координаты, если вы знаете ее координаты в корневом представлении. Это должно быть вычитание: anyPoint - globalOffset
.
Не забудьте проверить, что getGlobalVisibleRect()
возвращено true и что globalOffset
не является нулевым, прежде чем выполнять вычисления.