2011-09-01 11 views
9

è possibile trovare la vista che viene visualizzata in un dato coassolo x/y pixel assoluto?Trova la vista con le coordinate x/y date in Android

Edit: ho trovato una soluzione adeguata che le grandi opere:

private View findViewByCoord(float x, float y){ 
    TextView textView = null; 
    int[] location = new int[2]; 
    int width = 0; 
    int height = 0; 
    for(int reference : cardReference){ 
     textView = (TextView) findViewById(reference); 
     textView.getLocationOnScreen(location); 
     width = textView.getWidth(); 
     height = textView.getHeight(); 
     if(location[0] <= x && x <= (location[0] + width) && location[1] <= y && y <= (location[1] + height)){ 
      Log.i("Test", "Card " + textView.getText() + " is pointed"); 
      return textView; 
     } 
    } 
    return null; 
} 

Dove cardReference è un array di interi a Risorse (nel mio caso 20 TextViews disposti in una matrice 4 x 5):

int[] cardReference = new int[]{R.id.card1_1, R.id.card1_2, R.id.card1_3, R.id.card1_4, 
           R.id.card2_1, R.id.card2_2, R.id.card2_3, R.id.card2_4, 
           R.id.card3_1, R.id.card3_2, R.id.card3_3, R.id.card3_4, 
           R.id.card4_1, R.id.card4_2, R.id.card4_3, R.id.card4_4, 
           R.id.card5_1, R.id.card5_2, R.id.card5_3, R.id.card5_4}; 

Per velocizzare le prestazioni, prenderei in considerazione l'utilizzo di una matrice di TextViews e quindi chiamare findViewById() in ogni ciclo.

risposta

4

Una "soluzione" consiste nel passare in rassegna i figli della vista principale e controllare le coordinate getLeft() e getTop() rispetto alle coordinate X e Y di propria scelta. Se c'è una partita, hai la tua vista.

Mi piacerebbe sentire altre alternative però.

Modifica: Dovresti anche calcolare l'altezza/larghezza della vista rispetto alla sinistra e le coordinate in alto per vedere se le tue coordinate sono all'interno di tale intervallo.

Problemi correlati