¿Cuál es el equivalente a Android de las funciones convertRect / convertPoint de UIView?

UIView tiene lo siguiente:

- convertPoint:toView: - convertPoint:fromView: - convertRect:toView: - convertRect:fromView: 

¿Qué es el equivalente de Android? De manera más general, dado dos View s, ¿cómo obtengo el rect de la segunda View en el sistema de coordenadas de la primera?

No creo que haya un equivalente como parte de la sdk, pero parece que usted podría escribir su propia implementación muy fácilmente usando 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; } 

En Android podría no tener el método que exactamente como eso

Sin embargo, usted podría hacer por

View.getLocationOnScreen(int[] location) y View.getLocationInWindowint[] location()

cual

GetLocationOnScreen (ubicación int [])

Calcula las coordenadas de esta vista en su ventana.

GetLocationInWindow (int [] ubicación)

Calcula las coordenadas de esta vista en la pantalla.


O View.getLeft () y View.getTop ()

cual

se quedan()

Posición izquierda de esta vista en relación con su padre.

GetTop ()

Posición superior de esta vista en relación con su padre.


Para usted caso, yo utilizaría getLeft () y getTop () para encontrar su espacio entre 2 View y get range of it

Este enlace tiene un ejemplo de cómo encontrarlo usando getLeft () y 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()); } 

La forma de hacerlo es con 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 (egroffset(-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 (ie part of the view is visible at the * root level. */ 

Así que le das un Point y obtienes el desfase en relación con la View raíz. Ellos clave es que sus puntos de vista obtener una ubicación relativa a un elemento común. A continuación, puede utilizar este desplazamiento para calcular las posiciones relativas. El doc dice que para obtener las coordenadas locales, se desplaza el Rect con -globalOffset. Si desea obtener el Rect la segunda vista en coordenadas de la primera, Rect el Rect de la primera vista con -globalOffset de la segunda vista.

Del mismo modo, puede utilizar el globalOffset para transformar un punto en coordenadas relativas si sabe que es coordenadas en la vista raíz. Esto debe ser una substracción: anyPoint - globalOffset .

Recuerde comprobar que getGlobalVisibleRect() devuelve true y que globalOffset no es null antes de hacer los cálculos.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.