我不認爲有一種方法,實際上使可點擊區域矩形之外。 如果你的圓圈是圖像,你應該讓你的浮動按鈕的寬度和高度設置爲wrap_content。任何方式你應該設置它的寬度和高度以匹配圓的直徑。而處理該事件是這樣的:
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
ViewGroup.LayoutParams layoutParams = v.getLayoutParams();
float radius = layoutParams.width/2f;
float x = event.getX() - radius;
float y = event.getY() - radius;
if (isInCircle(radius, x, y)) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
// perform your action
}
return true;
} else {
return false;
}
}
private boolean isInCircle(float radius, float x, float y) {
if (Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) < radius) {
//touch was performed inside the circle;
return true;
} else {
//touched ouside the circle
return false;
}
}
}
);
這將任何設備上工作,只要你的按鈕在你繪製的圓緊緊包裹着。
如果不需要觸摸事件陷入更深,您的浮動按鈕下,當你錯過了一圈,就可以避免一些重複計算是這樣的:
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
ViewGroup.LayoutParams layoutParams = v.getLayoutParams();
float radius = layoutParams.width/2f;
float x = event.getX() - radius;
float y = event.getY() - radius;
if (isInCircle(radius, x, y)) {
// perform your action
}
}
return true;
}
private boolean isInCircle(float radius, float x, float y) {
if (Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) < radius) {
//touch was performed inside the circle;
return true;
} else {
//touched ouside the circle
return false;
}
}
}
);
請記住,這個工作你的按鈕應該是嚴格的矩形。如果你想要一個按鈕是一個橢圓,數學應該是不同的。
你可以只使用兩個按鈕,放置一個在工廠的頂部... – Dportology
我有一個自定義的橢圓形按鈕同樣的問題..的onclick在盒子發射反正...所以這不是隻有浮動動作按鈕我想,但在佈局一般.. 它看起來像他們必須只是平方.. –