2011-12-08 2 views
5

Ho lavorato su una piccola applicazione molto semplice utilizzando una vista estesa. Il problema è che non riesco a trovare ciò che è stato premuto nel mio onTouchEvent. Ho capito che devo confrontare i punti di pressione (xey) con gli elementi e vedere quale potrebbe essere.Checkin se premuto all'interno di rectF in onTouchEvent

Ma ... ho dichiarato un rettangolo utilizzando:

Paint color= new Paint(); 
color.setColor(Color.BLACK); 
rectF = new RectF(0.0f, 0.0f, 1.0f, 0.5f) ; 
canvas.drawRect(rectF, color); 

Fin qui tutto bene, ma nella funzione onTouchEvent

public boolean onTouchEvent(MotionEvent event) { 
    int action = event.getAction() ; 
    float x = event.getX() ; 
    float y = event.getY() ; 

    switch(action) { 
    case MotionEvent.ACTION_DOWN: 

     if(rectF().contains(x, y)) { 
      // Something should happen 
     } 

    } 

    invalidate(); 
    return true ; 
} 

ho impostato il rectF con un qualche tipo di relativa punti che vanno da 0-1, ma X e Y ottengo dagli intervalli di eventi da 0 in su a seconda delle dimensioni dello schermo.

Posso convertire facilmente uno dei valori?

Modifica

pensato che qualcuno era interessato alla soluzione finale ...

public boolean onTouchEvent(MotionEvent event) { 
    int action = event.getAction() ; 
    float x = event.getX() ; 
    float y = event.getY() ; 

    int width = this.getWidth() ; 
    int height = this.getHeight() ; 

    switch(action) { 
    case MotionEvent.ACTION_DOWN: 

     if(rectF().contains(x/width, y/height)) { 
      // Something should happen 
     } 

    } 

    return true ; 

} 

risposta

2

I valori del punto di contatto e la RectF devono essere sulla stessa scala di riferimento in oreder di essere confrontato correttamente. Il che significa che se si dichiara il vostro RectF utilizzare dimensioni relative (0-1) vi sia bisogno di:

1: normalizzare la posizione MotionEvent per le dimensioni dello schermo

OR 2: "denormalizzare" le RectF dimensioni da la tua dimensione effettiva dello schermo.

Penso che 1 sia generalmente preferibile in quanto consente di definire i propri rects in termini di layout relativo, indipendentemente dalle dimensioni effettive dello schermo e convertire le posizioni degli eventi al volo.

come questo: rectF.contains(x/screenWidth, y/screenHeight);

È possibile recuperare le dimensioni dello schermo chiamando
Display display = getWindowManager().getDefaultDisplay() nella vostra attività e quindi chiamando display.getWidth() o display.getHeight()

+0

ho scoperto che ho invece voluto la larghezza e l'altezza della vista, in modo da usato 'this.getHeight()' e 'this.getWidth()'. – dubbe

+0

@dubbe sicuro, non ero a conoscenza del tuo contesto, quindi ho dato consigli sul caso più semplice – kostja

+0

Lo so, ed è stato un consiglio perfetto, ho appena chiarito nel caso in cui qualcun altro sta cercando la stessa cosa! – dubbe