2015-07-23 7 views

risposta

9

Non credo che ci sia un equivalente come parte del SDK, ma sembra che si potrebbe scrivere una propria implementazione molto facilmente utilizzando 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; 
} 
0

In Android è potrebbe non avere il metodo che esattamente come quello

tuttavia, si potrebbe fare da

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

che

getLocationOnScreen (int [] posizione)

calcola le coordinate di questo vista sua finestra.

getLocationInWindow (int [] posizione)

calcola le coordinate di questa vista sul schermo.


o View.getLeft() e View.getTop()

che

getLeft()

posizione sinistra di questa vista rispetto al suo genitore .

getTop()

posizione superiore di questo punto di vista rispetto al suo genitore.


per voi caso, avrei usato getLeft() e getTop() per trovare il suo spazio tra i 2 View e ottenere gamma di esso

questo link ha un esempio di come trovarlo con getLeft() e 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()); 
} 
0

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.