2

다음은 Google 사양에 따라 FAB 크기입니다. enter image description here플로팅 작업 버튼의 원 안에 클릭 만 허용하려면 어떻게해야합니까?

내 응용 프로그램의 경우 사각형 컨테이너 (56x56) 안의 클릭을 피하면서 FAB의 원을 클릭하면 해고되는 클릭 리스너가 필요합니다.

"전체"버튼의 각 onClick 이벤트에서 X, Y를 얻은 다음 내 Fab의 원 안에 있는지 확인하고 싶지만 정확도 클릭 문제가 발생할 수 있으므로이 해결 방법에서 벗어나고 싶습니다. 다른 장치 해상도.

다른 해결책이 있습니까?

미리 감사드립니다.

편집 :

나는 실제로 내가 항상 장치 화면의 변화에서 동일한 정밀도를 얻을 것이다 생각하십니까
LINK
자바 번역이 자바 스크립트 솔루션을 구현했습니다?

+0

두 개의 버튼을 사용하여 팹 위에 하나를 배치 할 수 있습니다. – Dportology

+0

사용자 정의 타원형 버튼이있는 동일한 문제가 있습니다 ... 상자에서 onClick이 어쨌든 해고되었습니다. 내가 생각하기에 떠 다니는 액션 버튼에 대해서만,하지만 일반적으로 레이아웃에서는 .. 그들은 제곱이되어야하는 것처럼 보입니다. –

답변

0

사실 직사각형 이외의 클릭 가능한 영역을 만드는 방법은 없다고 생각합니다. 원이 이미지 인 경우 부동 버튼의 너비와 높이를 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; 
            } 
           } 
          } 
    ); 

이 작동하는 것을 염두에 두십시오 귀하의 버튼은 엄격하게 직사각형이어야합니다. 버튼을 타원으로 만들려면 수학이 달라야합니다.