Android 터치 이벤트 배포

2501 단어
터치 이벤트 배포
몇 가지 중요한 방법
  • 터치 이벤트 배포: View에 정의
     @Override
     public boolean dispatchTouchEvent(MotionEvent ev) {
         return super.dispatchTouchEvent(ev);
     }
    
  • 이 방법은 일반적으로 처리하지 않는다.
  • 이 방법은 내부에서 이벤트 끊기와 이벤트 처리 방법을 호출했다
  • 이번 터치 이벤트에서 컨트롤이나 하위 컨트롤이 이벤트를 처리하면 되돌아오기true
  • 터치 이벤트 인터럽트: ViewGroup
     @Override
     public boolean onInterceptTouchEvent(MotionEvent ev) {
         return super.onInterceptTouchEvent(ev);
     }
    
    에 정의됨
  • 터치 이벤트의 전달을 끊는다(부 컨트롤러는 하위 컨트롤러가 터치 이벤트에 대한 처리권을 회수한다)
  • 자신이 처리한 사건을 끊을 수 없음
  • 하위 컨트롤러가 이벤트 처리를 끊을 때 하위 컨트롤러가 호출됩니다action_cancel. 하위 컨트롤러는 이 이벤트를 처리해야 할 수도 있습니다
  • 터치 이벤트 처리: View
     @Override
     public boolean onTouchEvent(MotionEvent event) {
         return super.onTouchEvent(event);
     }
    
    에 정의
  • 처리가 action_down에만 유효한지 여부: action_down에서 되돌아오면 true 이번 터치 이벤트를 모두 처리해야 한다는 뜻
  • 내부 호출onTouch(), 사용자가 setOnTouchListener 감청을 실현하면 그 반환값은 onTouchEvent
  • 이다.

    터치 이벤트 처리(U형): 이벤트는 아버지 컨트롤 -->하위 컨트롤에서 나눠주고, 이벤트 처리는 하위 컨트롤 -->부 컨트롤에서 처리될 때까지 한다.
    이벤트 충돌 처리 예
    SlidingPaneLayout 레이아웃에 하위 컨트롤이 ViewPager가 있을 때 SlidingPaneLayout이 ViewPager의 미끄럼 이벤트 처리를 끊습니다.
    솔루션 1: ViewPager 추가setOnTouchListener
    pager.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // v  viewpager
            ViewGroup parent = (ViewGroup) v.getParent();
            float x = event.getX();
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                if (x < parent.getWidth() / 5) { //      
                    parent.requestDisallowInterceptTouchEvent(false); //   ,              ,        SlidingPaneLayout
                } else {
                    parent.requestDisallowInterceptTouchEvent(true); //     ,    ViewPager
                }
            }
            return false;
        }
    });
    

    솔루션 2: 사용자 정의SlidingPaneLayout
    public class PagerAdapter extends android.support.v4.view.PagerAdapter {
    
        //       
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            if (ev.getAction() == MotionEvent.ACTION_DOWN) {
                flag = isOpen() || (ev.getX() < getWidth() / 5);
            }
            return flag && super.onInterceptTouchEvent(ev);
        }
    }

    좋은 웹페이지 즐겨찾기