android中的圆形按钮..避免按下“外部”按钮?

时间:2012-01-29 00:26:44

标签: android

我已经创建/尝试使用ImageButton“小部件”为Android创建一个圆形按钮。 但由于这种类型的按钮被视为正方形而我的png图像也被视为具有透明背景的正方形,那么如何避免用户在圆形按钮外按压?...原因至于现在..他们可以按下按钮的“角落”,这仍然会触发点击事件.. 是否有任何特殊的映射层可以在photoshop中完成或以任何方式更改图像按钮的半径,以便它适合我的图像的“圆度”..或任何想法?

提前致谢!...抱歉英语不好..

2 个答案:

答案 0 :(得分:5)

尝试Pythagorean定理和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是你拥有的触摸事件。

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

答案 1 :(得分: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;
}

希望这对某人有用。