Я не думаю, что есть способ создать интерактивную область, отличную от прямоугольной. Вы должны сделать свою плавающую кнопку шириной и высотой, установленной на 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;
}
}
}
);
Имейте в виду, что для этого ваша кнопка должна быть строго прямоугольной. если вы хотите, чтобы кнопка была эллипсом, математика должна быть другой.
person
Timur Gorchag
schedule
28.10.2016