Il modo per farlo è 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 (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.
*/
in modo da dare un Point
e ottenere l'offset relativo alla radice View
. La chiave è che le tue visualizzazioni ottengono una posizione relativa a un elemento comune. È quindi possibile utilizzare questo offset per calcolare le posizioni relative. Il documento dice di ottenere coordinate locali, si compensa il Rect
con -globalOffset. Se si desidera ottenere la seconda vista Rect
in coordinate del primo, quindi sfalsare lo Rect
della prima visualizzare con -globalOffset della vista seconda.
Analogamente, è possibile utilizzare globalOffset
per trasformare un punto in coordinate relative se si conoscono le sue coordinate nella vista radice. Questa dovrebbe essere una sottrazione: anyPoint - globalOffset
.
Ricordarsi di verificare che getGlobalVisibleRect()
sia stato restituito true e che globalOffset
non sia null prima di eseguire i calcoli.