2012-01-29 9 views
7

He creado/intentado crear, un botón redondo para Android utilizando el "widget" ImageButton. Pero dado que ese tipo de botón se trata como un cuadrado y mi imagen png también se trata como un cuadrado con un fondo transparente, ¿cómo evito que el usuario pueda presionar fuera del botón redondo? ahora ... pueden presionar en las "esquinas" del botón y eso aún activará el evento de clic ... ¿Hay alguna capa de mapeo especial que se pueda hacer en photoshop o de alguna manera para cambiar el radio del botón de imagen? por lo que se ajusta a la "redondez" de mi imagen ... ¿o alguna idea?Botón redondo en Android ... evite las prensas "afuera" del botón?

Gracias de antemano! .. y lo siento por mala Inglés ..

Respuesta

5

intenta teorema de Pitágoras y onTouch, simple y fácil de hacerlo.

public boolean inCircle(MotionEvent e, int radius, int x, int y) { 
    int dx = e.x - x; 
    int dy = e.y - y; 
    double d = Math.sqrt((dx * dx) + (dy * dy)); 
    if(d < radius) 
     return true; 
    return false; 
} 

la x, y es la posision del círculo, el radio es el radio, y la dirección es la TouchEvent que tiene.

@Override 
public boolean onTouch(View arg0, MotionEvent arg1) { 
    if(arg1.getAction() == MotionEvent.ACTION_DOWN){ 
      if(inCircle(arg1, radius, xCircle, yCircle){ 
        //do whatever you wanna do here 
        } 
      } 
    return false; 
} 
+0

son las unidades para usar dp o píxeles? .. y por posición .. es la posición para usar la posición central del círculo .. o la esquina superior izquierda? .. – Inx

+0

Gracias por ayudar :) – Inx

+0

intenté esto. .pero parece que está contando desde la esquina superior izquierda y no moverá el "pivote" del círculo al que contar desde .. – Inx

2

que estaba usando un ImageView como mi botón círculo, y yo tenía que hacer algunos cambios en @ código de Daniel para que funcione de la manera que quería. Aquí está mi código:

private boolean mStillDown = false; 

public boolean inCircle(MotionEvent e, float radius, float x, float y) { 
    float dx = e.getX() - x; 
    float dy = e.getY() - y; 
    double d = Math.sqrt((dx * dx) + (dy * dy)); 
    if(d < radius) 
     return true; 
    return false; 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 

    int action = event.getAction(); 
    boolean inCircle = inCircle(event, getWidth()/2.0f, getWidth()/2.0f, getHeight()/2.0f); 

    if(inCircle){ 
     if(action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_POINTER_DOWN){ 
      this.setPressed(true); 
      mStillDown = true; 
     }else if(action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_POINTER_UP){ 
      if(this.isPressed()){ 
       this.performClick(); 
       this.setPressed(false); 
       mStillDown = false; 
      } 
     }else if(action == MotionEvent.ACTION_MOVE && mStillDown){ 
      this.setPressed(true); 
     } 
    }else{ 
     if(action == MotionEvent.ACTION_MOVE){ 
      this.setPressed(false); 
     }else if(action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_POINTER_UP || action == MotionEvent.ACTION_OUTSIDE){ 
      mStillDown = false; 
     } 
    } 

    return true; 
} 

Espero que esto le sea útil a alguien.