ViewDragHelper 빈 포인터 예외 노트

ViewDrapHelper 소개
실제 프로젝트에서 View Group의 서브뷰가 사용자의 손가락을 드래그하면 그에 상응하는 변화가 발생할 수 있다. 예를 들어 손가락을 드래그하면 움직이는 등이다. 그러나 온터치 이벤트와 온터치 이벤트 처리는 비교적 번거롭고 오류가 발생하기 쉽기 때문에 구글은 ViewDrapHelper 클래스를 제공하여 support-v4 패키지에 위치한다.이 종류는 개발자가 쉽게 사용할 수 있도록view 동작을 드래그합니다.
ViewDrapHelper의 생성 및 사용
ViewDrapHelper 사례 코드를 만듭니다.
ViewDragHelper dragHelper = ViewDragHelper.create(ViewGroup forParent, Callback cb)

ViewDrapHelper를 만들 때 ViewGroup 대상과 서브뷰가 사용자의 손가락을 드래그하는 데 반응하는 콜백 대상을 전달해야 합니다.
Callback 클래스 일반 방법
//    child       (             )
public boolean tryCaptureView(View child, int pointerId)

//    child            ,      child           (     )   ,        
public int getViewHorizontalDragRange(View child)
public int getViewVerticalDragRange(View child)

//      child     ,  left=child.getLeft()+dx
public int clampViewPositionHorizontal(View child, int left, int dx)
public int clampViewPositionVertical(View child, int top, int dy)

//  view          ,dx dy                    :  view      changedView      
public void onViewPositionChanged(View changedView, int left, int top,int dx, int dy)

//      view   
    :releasedChild     
public void onViewReleased(View releasedChild, float xvel, float yvel)

또한 ViewDrapHelper는 Scroller에 대한 패키지 사용 사례 코드를 제공합니다.
viewDrapHelper.smoothSlideViewTo(View child, int finalLeft, int finalTop)

@Override
    public void computeScroll() {
        super.computeScroll();
        if (dragHelper.continueSettling(true)) {
            ViewCompat.postInvalidateOnAnimation(SwipLayout.this);
        }
    }

빈 포인터 예외
ViewDrapHelper를 사용할 때 ViewGroup의 onTouchEvent와 onInterceptTouchEvent 두 가지 방법을 다시 쓰고 이 두 가지 방법에서viewDrapHelper를 호출해야 합니다.프로세스 터치 이벤트(event)와viewDrapHelper.shouldInterceptTouchEvent(ev), 빈 바늘 이상이 발생하는 것은 이 두 방법 중 MotionEvent 이벤트를viewDrapHelper에게 전달하지 않은 방법을 만져보는 것이다.오류 코드:
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {

    if (XXXXX) {
        return true;
        }
    return viewDrapHelper.shouldInterceptTouchEvent(ev);
    }

오류 분석, onIntercept Touch Event 방법에서 차단 이벤트를 처리할 때 조건 XXXXX가 성립되지 않을 때만view DrapHelper Motion Event 이벤트에 전달됩니다. 그렇지 않으면view DrapHelper는 처리 이벤트를 가져올 수 없습니다.ontouchevent 방법에서view DrapHelper를 호출합니다.프로세스 터치 이벤트 메서드는 빈 포인터 이상을 보고합니다.
올바른 코드:
@Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        boolean res = dragHelper.shouldInterceptTouchEvent(ev);
        if (XXXXX) {
            res = true;
        }
        return res;
    }

좋은 웹페이지 즐겨찾기