2011-12-08 7 views
5

He estado trabajando en una pequeña aplicación muy simple con una vista ampliada. El problema es que no puedo encontrar lo que se ha presionado en mi onTouchEvent. He entendido que tengo que comparar los puntos de presión (x e y) con los elementos y ver cuál podría ser.Registro si se presiona dentro de rectF en onTouchEvent

Pero ... He declarado un rectángulo usando:

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

Hasta aquí todo bien, pero en la función 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 ; 
} 

fijo el rectF con algún tipo de relación puntos que van de 0 a 1, pero la X e Y que obtengo de los eventos varían de 0 en adelante dependiendo del tamaño de la pantalla.

¿Puedo convertir fácilmente cualquiera de los valores?

Editar

pensó que alguien estaba interesado en la solución final ...

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 ; 

} 

Respuesta

2

Los valores del punto de contacto y el RectF tiene que estar en la misma escala de referencia en oreder estar comparado apropiadamente. Lo que significa que si se declara su RectF utilizar tamaños relativos (0-1) que o bien necesitar:

1: normalizar la posición MotionEvent por el tamaño de la pantalla

O 2: "a eliminar la normalización" RectF las dimensiones de su tamaño de pantalla real.

Creo que 1 es preferible, ya que le permite definir sus rectas en términos de diseño relativo, independientemente del tamaño de la pantalla real y convertir las posiciones del evento sobre la marcha.

así: rectF.contains(x/screenWidth, y/screenHeight);

Puede recuperar las dimensiones de la pantalla llamando
Display display = getWindowManager().getDefaultDisplay() en su actividad y luego llamar display.getWidth() o display.getHeight()

+0

me di cuenta de que en vez quería que la anchura y la altura de la vista, por lo que usó 'this.getHeight()' y 'this.getWidth()' en su lugar. – dubbe

+0

@dubbe seguro, no estaba al tanto de su contexto, así que di consejos sobre el caso más simple – kostja

+0

Lo sé, y fue un consejo perfecto, ¡simplemente lo aclaré en caso de que alguien más esté buscando lo mismo! – dubbe

Cuestiones relacionadas