Android中的圆形按钮..如何避免在按钮“外部”按下?

7
我尝试使用ImageButton "widget"创建了一个圆形Android按钮。但由于这种类型的按钮被视为正方形,我的png图像也被视为带有透明背景的正方形,那么我该如何避免用户能够在圆形按钮外部按下?因为现在他们可以在按钮的“角落”按下,仍然会触发点击事件。是否有任何特殊的映射层可以在Photoshop中完成,或者是否有任何改变图像按钮半径以适应我的图像“圆度”的方法,或者有任何想法吗?
提前感谢!抱歉英文不好。
2个回答

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是圆的位置,radius是半径,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;
}

使用dp还是像素作为单位?.. 以及按位置.. 是在圆形的中心位置还是在左上角?.. - Inx
尝试过这样做,但似乎它是从左上角开始计数,并不会移动圆形的“支点”以进行计数。 - Inx
它从中间开始计数,如果你有一个正方形,就像这样做: - SlowDeepCoder
1
InCircle(arg1, imageaView.getWidth(), imageview.getWidh()/2, imageWiew.getHeight()/2. 在圆形内(arg1,imageaView.getWidth(),imageview.getWidh()/2,imageWiew.getHeight()/2)。 - SlowDeepCoder
是的,非常感谢 :).. 终于可以利用我的数学知识了..一直在做很多ASP.net..但实际上并没有太多数学..这也很好..但自己思考解决问题也是有趣的 :)..非常感谢你的帮助 :) - Inx
这对我很有用。我稍微修改了一下,使其与“ImageView”良好地配合工作。 - JstnPwll

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

希望这对某些人有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接