2012-01-29 114 views
7

我已经创建/试图创建,通过使用ImageButton“小部件”android的圆形按钮。 但由于该类型的按钮被视为一个正方形,我的PNG图像也被视为一个具有透明背景的正方形,那么如何避免用户可以按下圆形按钮之外的按钮?现在..他们可以按下按钮的“角落”,并仍然会触发点击事件。 是否有任何可以在Photoshop中完成的特殊映射图层或以任何方式更改图像按钮的半径所以它符合我的形象“圆润”..或任何想法?Android中的圆形按钮..避免按下“外部”按钮?

提前感谢!..和英文不好抱歉..

回答

5

尝试勾股定理和onTouch,简单易用的方式来做到这一点。

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; 
} 

x,y是圆的位置,半径是半径,e是TouchEvent。

@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

是使用dp或像素的单位?..按位置..是使用圆的中间位置的位置..还是左上角? – Inx 2012-01-29 02:03:41

+0

感谢您的帮助:) – Inx 2012-01-29 02:04:10

+0

试过这个。但它看起来像从左上角开始计数,并且不会移动从中算起的圆的“枢轴”。 – Inx 2012-01-29 02:55:40

2

我正在使用ImageView作为我的圆形按钮,并且我需要对@ Daniel的代码进行一些更改以使其按照我想要的方式工作。这里是我的代码:

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; 
} 

希望这对某人有用。