2013-08-14 5 views
2

SemiClosedSlidingDrawer (http://pastebin.com/FtVyrcEb)를 사용 중이며 항상 표시되는 슬라이더 상단의 일부 버튼에 내용 부분을 추가했습니다.

슬라이더가 완전히 열렸을 때만 클릭 가능 (또는 클릭 이벤트가 전달됨)하는 문제가 있습니다 ...
슬라이더가 "반 개방"인 경우 클릭 이벤트가 버튼으로 표시되지 않는 것 같습니다 ...
나는 onInterceptTouchEvent (에 디버거) 및 두 경우 (반 축약/연) 다음 코드세미 붕괴시 SemiClosedSlidingDrawer onClick이 전달되지 않습니다.

@Override 


    public boolean onInterceptTouchEvent(MotionEvent event) { 
      if (mLocked) { 
       return false; 
      } 

      final int action = event.getAction(); 
      float x = event.getX(); 
      float y = event.getY(); 

      final Rect frame = mFrame; 
      final View handle = mHandle; 

      handle.getHitRect(frame); 

      //FOLLOWING THE CRITICAL CODE 
      if (!mTracking && !frame.contains((int) x, (int) y)) { 
      return false; 
      } 

창 거짓 있지만, 슬라이더를 개방 이벤트 dispached 하였다 때만 ... 그것은 검사 만약 (x, y)의 클릭에 상대적으로 슬라이딩 서랍의 HandleButton 뷰에서 시작하여 생성 된 사각형에 포함되어 있습니다.



    final Rect frame = mFrame; 
      final View handle = mHandle; 
      handle.getHitRect(frame); 

내가 slidingdrawer의 내용 일부가 내부에 포함 된 버튼을 클릭하고 있는데 그 괜찮아 때문에 분명 거짓 ...
내가 문제 위에 말했듯이 반 축약 상태에서 버튼 콘텐츠에 포함 된 것입니다 일부가 이벤트를 수신하지 못했습니다 ...

이 문제를 어떻게 해결할 수 있습니까?
접을 때 자녀를 클릭하지 않는 슬라이딩 드로어 상태 일 수 있습니까?
미리 감사드립니다 ...

+0

동일한 문제가 있습니다. 해결책을 찾았 니? – lordmegamax

+0

행운이 있나요? – DPR

답변

0

맞아, 나는 이것을 할 방법을 찾은 것 같아.

먼저 반 개방 상태에서 사용자가 보이는 내용을 누를 때마다 onInterceptTouchEvent()을 수정하여 true을 반환해야합니다. 당신의 SemiClosedSlidingDrawer 뷰가 화면의 맨 아래에있는 경우 그래서, 예를 들어, 당신은 다음과 같이 간단한 검출 알고리즘을 사용할 수 있습니다

public boolean onInterceptTouchEvent(MotionEvent event) { 
    ... 
    handle.getHitRect(frame); 

    // NEW: Check if the user pressed on the "semi-open" content (below the handle): 
    if(!mTracking && (y >= frame.bottom) && action == MotionEvent.ACTION_DOWN) { 
     return true; 
    } 

    if (!mTracking && !frame.contains((int) x, (int) y)) { 
    ... 
} 

이제 터치 이벤트를 사용자의 상호 작용시 반 개설과 함께 콘텐츠는 onTouchEvent()으로 발송됩니다. 이제 우리는 그냥 "수동으로"올바른보기로 리디렉션 이러한 이벤트를 가로 챌 필요가 있고 (우리는 또한 아이 뷰의 좌표 오프셋 할 필요가 있습니다) :

public boolean onTouchEvent(MotionEvent event) { 
    ... 
    if (mTracking) { 
     ... 
    } 
    else 
    { 
     // NEW: Dispatch events to the "semi-open" view: 
     final Rect frame = mFrame; 
     final View handle = mHandle; 
     handle.getHitRect(frame); 

     float x = event.getX(); 
     float y = event.getY() - frame.bottom; 

     MotionEvent newEvent = MotionEvent.obtain(event); 
     newEvent.setLocation(x, y); 
     return mContent.dispatchTouchEvent(newEvent); 
    } 

    return mTracking || mAnimating || super.onTouchEvent(event); 
} 

그것은 지저분한 구현의 약간의,하지만 나는 기본 개념이 옳다고 생각한다. 그것이 당신을 위해 어떻게 작동하는지 알려주세요!