사실 직사각형 이외의 클릭 가능한 영역을 만드는 방법은 없다고 생각합니다. 원이 이미지 인 경우 부동 버튼의 너비와 높이를 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이 어쨌든 해고되었습니다. 내가 생각하기에 떠 다니는 액션 버튼에 대해서만,하지만 일반적으로 레이아웃에서는 .. 그들은 제곱이되어야하는 것처럼 보입니다. –