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