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