Round button in android.. avoid presses “outside” the button?

后端 未结 2 813
感动是毒
感动是毒 2020-12-16 04:26

I have created/tried to create, a round button for android by using the ImageButton \"widget\". But since that type of button is treated as a square and my png-image also is

相关标签:
2条回答
  • 2020-12-16 04:51

    Try Pythagorean theorem and onTouch, simple and easy way to do it.

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

    the x, y is the posision of the circle, the radius is the radius, and the e is the TouchEvent you have.

    @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 讨论(0)
  • 2020-12-16 04:55

    I was using an ImageView as my circle button, and I needed to make some changes to @Daniel's code to make it work the way I wanted. Here's my code:

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

    Hopefully this is useful to someone.

    0 讨论(0)
提交回复
热议问题