Android Custom View를 사용하여 터치 영역을 둥글게 만듭니다.

3834 단어 Android

안드로이드 맞춤형 터치 영역


나는 이런 상황을 구상하고 있다.

이처럼 커스텀뷰의 터치 판정 영역을 맞춤형으로 제작할 때 어떻게 하면 좋을지 조사한 결과를 정리했다.
둥근 버튼을 만들 때나 독자적인 모양의 뷰를 만들 때 터치 영역을 사각형으로 유지할 방법을 강구해야 한다는 의견이 나와 만들었다.(수요가 적은 것 같다)

View#dispatchTouchEvent 사용


결과적으로 View급 디스패치 터치 이벤트 오버라이드를 사용하면 된다.
CircleDetectView.java
public class CircleDetectView extends View {
    //... 中略

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        float touchX = event.getX(), touchY = event.getY();
        float r = getWidth() / 2;

        // 中心からタッチ点までの距離(の2乗)を計算
        // float lenght = (float)Math.pow(touchX - r, 2) + (float)Math.pow(touchY - r, 2);
        // 追記(2015/2/26):
        // 距離を測る Math.hypot という大層便利なメソッドがありました。
        double length = Math.hypot(touchX - r, touchY - r);

        // (中心からタッチ点までの距離)^2 <= (円の半径)^2
        if (length <= r * r) {
            // 円の内部
            // (superを呼び出すことによってonTouchやonClickを呼び出すようにする)
            return super.dispatchTouchEvent(event);
        } else {
            // 円の外部(falseにすると、onTouchやonClickなどが呼ばれない)
            return false;
        }
    }
}
디스패치 터치 이벤트가 터치 이벤트의 시작점으로 사용되기 때문에 이것을 조금만 만지면 해결될 것 같습니다.
이번에는 원의 안쪽을 터치 구역으로 삼고 싶은데 터치점에서 원의 중심(이번은 View의 중심)까지의 거리가 반경보다 작다면 원의 안쪽을 터치했다는 뜻이다.

전망하다


구역 판단 부분을interface로 하고 스스로 구역을 정하면 재미있을 것 같아요.
예를 들어 성형의 판정은 같은 원이라도 중심의 반원의 터치 구역을 엇갈릴 수 있다는 등 다양한 가능성이 있는 것 같다.

사이트 축소판 그림


안드로이드의 터치 이벤트 이해하기(중 하나)
http://blog.lciel.jp/blog/2013/12/03/android-touch-event/

좋은 웹페이지 즐겨찾기