2010-11-12 10 views

risposta

80

Bene per chiunque voglia sapere cosa ho fatto ... non potevo. Ho fatto una soluzione di sapere se la mia specifica componente di vista è stato cliccato, così ho potuto finire solo con questo:

if(isPointInsideView(ev.getRawX(), ev.getRawY(), myViewComponent)){ 
    doSomething() 
    } 

e il metodo:

/** 
* Determines if given points are inside view 
* @param x - x coordinate of point 
* @param y - y coordinate of point 
* @param view - view object to compare 
* @return true if the points are within view bounds, false otherwise 
*/ 
public static boolean isPointInsideView(float x, float y, View view){ 
    int location[] = new int[2]; 
    view.getLocationOnScreen(location); 
    int viewX = location[0]; 
    int viewY = location[1]; 

    //point is inside view bounds 
    if((x > viewX && x < (viewX + view.getWidth())) && 
      (y > viewY && y < (viewY + view.getHeight()))){ 
     return true; 
    } else { 
     return false; 
    } 
} 

Tuttavia questo funziona solo per osservazioni nel layout che puoi passare come parametro, non riesco ancora a ottenere la vista cliccata conoscendo le coordinate. Puoi comunque cercare tutte le viste nel layout.

+9

privato booleano isPointInsideView (float x, float y, Panorama vista) { \t \t Rect rect = new Rect(); \t \t view.getDrawingRect (rect); \t \t return rect.contains ((int) x, (int) y); \t} – etienne

+0

Suggerimento: ottimo metodo candidato per essere reso statico. – m0skit0

+6

@etienne, si noti che getDrawingRect() restituisce informazioni sul disegno rect mostrato all'interno di una vista di scorrimento. Non funziona se vuoi ottenere il rect di una vista che è annidata in un'altra vista. La soluzione di htafoya funziona come previsto. – sulai

3

Un modo semplice per ottenere la vista toccata consiste nell'impostare un OnTouchListener sulle singole visualizzazioni e archiviare la vista in una variabile di classe dell'attività. La restituzione di false renderà l'evento di input disponibile per il metodo onTouchEvent() dell'attività, in cui è possibile gestire facilmente tutti gli eventi di tocco (anche quelli della vista principale).

myView.setOnTouchListener(new OnTouchListener() { 
    public boolean onTouch(View v, MotionEvent event) { 
    touchedView = myView; 
    return false; 
    } 
}); 


@Override 
public boolean onTouchEvent(MotionEvent event) { 


    switch (event.getAction()) { 

     case MotionEvent.ACTION_UP: 

      if(touchedView!=null) { 
       doStuffWithMyView(touchedView); 
      .... 
      .... 
3

Giusto per rendere il metodo di htafoya semplice:

/** 
* Determines if given points are inside view 
* @param x - x coordinate of point 
* @param y - y coordinate of point 
* @param view - view object to compare 
* @return true if the points are within view bounds, false otherwise 
*/ 
private boolean isPointInsideView(float x, float y, View view) { 
    int location[] = new int[2]; 
    view.getLocationOnScreen(location); 
    int viewX = location[0]; 
    int viewY = location[1]; 

    // point is inside view bounds 
    return ((x > viewX && x < (viewX + view.getWidth())) && 
      (y > viewY && y < (viewY + view.getHeight()))); 
} 
+0

Ripetendo il mio commento dall'alto: view.getLocationOnScreen non ha funzionato per me - penso che possa restituire le coordinate del centro della vista, quindi il clic deve essere nell'angolo in basso a destra della vista affinché il test restituisca true , quindi il controllo dei limiti in questo esempio è sbagliato. Utilizzare invece questo test: (x> = view.getLeft() && x <= view.getRight()) && (y> = view.getTop() && y <= view.getBottom()). – gjgjgj

Problemi correlati