Что такое андроидный эквивалент функций 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 не является нулевым, прежде чем выполнять вычисления.