実際にクリック可能な領域を四角形以外にする方法はないと思います。 サークルがイメージの場合、フローティングボタンの幅と高さを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;
}
}
}
);
があることに留意してくださいボタンは厳密に長方形でなければなりません。ボタンを楕円にしたい場合、数学は異なるはずです。
2つのボタンを使用して、ファブの上に1つのボタンを配置することができます。 – Dportology
カスタム楕円形のボタンを使用して同じ問題が発生しました。onClickはボックスで起動されます...そうではありません私が想定しているフローティングアクションボタンについてのみですが、一般的なレイアウトでは それは2乗だけでなければならないようです –