2012-06-06 1 views
1

SlidingDrawer ViewGroup을 사용하려고하지만 몇 가지로드 블록이 있습니다.SlidingDrawer 서랍이 완전히 열리기 전에 서랍을 당겨서 뒤로 밀었는지 확인하십시오.

OnDrawerScrollListener 
OnDrawerOpenListener 
OnDrawerCloseListener 

onScrollStarted()을 SlidingDrawer 핸들이 처음 당겨 때 호출되는 : 우리는 SlidingDrawer에 연결할 수있는 몇 가지 청취자가 있습니다.

사용자가 핸들에서 손가락을 추적하지 않으면 (놀랍게도 애니메이션이 끝난 후에) onScrollEnded()가 호출됩니다.

onDrawerOpened()는 사용자가 손가락을 들고 서랍이 완전히 움직이는 애니메이션 인 경우에만 호출됩니다.

onDrawerClosed()는 사용자가 손가락을 들고 서랍이 애니메이션으로 완전히 닫힌 경우에만 호출됩니다.

서랍이 열리기 시작하면 내 활동의 기본보기가 비활성화됩니다 (onScrollStarted() 수행 가능). 서랍을 닫으면 내 활동의 기본보기가 활성화됩니다. 사용자가 서랍을 반 열어 놓은 다음 손가락을 올리지 않고 서랍을 완전히 다시 드래그하면 onDrawerClosed()가 호출되지 않아 다시 기본보기를 사용할지 여부를 결정하는 방법을 알지 못합니다. 서랍이 완전히 열리거나 완전히 닫히기 직전에 해당 메서드가 호출되기 때문에 onScrollEnded()에서 기본보기를 활성화 할 수 없습니다.

내가 언급 한 3 청취자 내에서 호출의 순서는 다음과 같습니다

onScrollStarted() onScrollEnded() onDrawerOpened() /를 onScroll 방법에()

그래서 명확하게, onDrawerClosed 방법이 없습니다 터치 이벤트를 듣지 않으면 서랍이 "열기"또는 "닫히기"인지 여부를 결정할 수 있습니다. 너무 지저분하지 않을 수있는 방법이 있나요?

감사합니다.

수정 : 여기 내 코드 조각입니다.

private boolean mDrawerScrolling = false; 

    @Override 
    public void onDrawerOpened() { 
     Log.d(TAG, "onDrawerOpened"); 
    } 

    @Override 
    public void onDrawerClosed() { 
     mViewPager.setScrollEnabled(true); 

     Log.d(TAG, "onDrawerClosed"); 

     final View view = (View) mDrawer.getTag(); 
     if (view != null) { 
      final Animator fadeInAnimation = AnimatorInflater.loadAnimator(
        InboxActivity.this, R.animator.fade_out); 
      fadeInAnimation.setTarget(view); 
      fadeInAnimation.addListener(new AnimatorListenerAdapter() { 

       @Override 
       public void onAnimationEnd(Animator animation) { 
        removeView(); 
       } 

       @Override 
       public void onAnimationCancel(Animator animation) { 
        removeView(); 
       } 

       private void removeView() { 
        ViewGroup container = (ViewGroup) findViewById(R.id.container); 

        container.removeView(view); 
       } 

      }); 
      fadeInAnimation.start(); 

      mDrawer.setTag(null); 
     } 
    } 

    @Override 
    public void onScrollEnded() { 
     mDrawerScrolling = false; 

     int left = mDrawer.getHandle().getLeft(); 

     Log.d(TAG, "onScrollEnded() " + left); 
    } 

    @Override 
    public void onScrollStarted() { 
     mDrawerScrolling = true; 
     mCanHide = false; 

     Log.d(TAG, "onScrollStarted"); 

     /* 
     * Open the drawer if it is not open yet. 
     */ 
     if (mDrawer.getTag() == null) { 
      final View dimView = getLayoutInflater().inflate(
        R.layout.drawer_outer, null); 
      RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
        RelativeLayout.LayoutParams.MATCH_PARENT, 
        RelativeLayout.LayoutParams.MATCH_PARENT); 
      dimView.setLayoutParams(params); 
      dimView.setOnTouchListener(this); 

      final ViewGroup container = (ViewGroup) findViewById(R.id.container); 
      container.addView(dimView); 
      container.bringChildToFront(mDrawer); 

      final Animator fadeInAnimation = AnimatorInflater.loadAnimator(
        InboxActivity.this, R.animator.fade_in); 
      fadeInAnimation.setTarget(dimView); 
      fadeInAnimation.start(); 

      mDrawer.setTag(dimView); 
     } 
    } 

답변

1

어떻게 지금까지 무엇을했는지와 조합 slidingdrawer 클래스에서 다른 상태 기능을 사용하는 방법에 대한. 나는 isOpened 또는 isMoving과 같은 사용 함수를 생각하고 있습니다. inScrollEnded에서 이것을 호출하여 서랍의 상태를 파악하고 그에 따라 조치를 취할 수 있습니다.

+0

onScrollStarted()/onScrollEnded() isMoving()은 항상 true를 반환합니다. isOpened()는 드로어가 완전히 열린 상태 또는 완전히 닫힌 상태에서 onScroll 메서드를 시작했는지 여부에 따라 true/false를 반환합니다. 여기서 문제는 닫힌 서랍에서 시작하여 서랍을 열어 flinging하면 1. onScrollStarted() 2. onScrollEnded() 3. onDrawerOpened()입니다. # 2의 노트는 서랍이 열려 있는지 여부를 모르겠습니다. 닫힌 서랍에서 시작하여 서랍을 절반 열린 상태로 드래그 한 다음 다시 완전히 닫으면 1. onScrollStarted() 2. onScrollEnded()가됩니다. – mdupls

+0

onScroll 메서드의 경우 1 (위)에서 isOpened()가 false를 반환합니다. onScroll 메서드의 경우 2 (위)에서 isOpened()는 false를 반환합니다. 이 두 가지 경우는 완전히 다르게 처리되어야합니다! 사례 1 - 기본보기를 비활성화 상태로 유지합니다. 사례 2 - 기본보기를 사용하도록 설정합니다. 이게 말이 돼? 감사. – mdupls

+0

코드를 게시하면 onscrollEnded에서 isOpened가 작동하지 않는 이유를 이해하는 데 어려움을 겪고 있습니다. – Orlymee

3

언젠가 비슷한 문제가 발생하여 setOnDrawerScrollListener(), isMoving(), isOpened(), Runnable(), Handler(), and Thread() 클래스를 사용하는 간단한 솔루션을 만들 수있었습니다. 아래에 내 솔루션과 의견을 게시했습니다.

mSlidingDrawer.setOnDrawerScrollListener(new OnDrawerScrollListener() { 

     private Runnable mRunnable = new Runnable() { 

      @Override 
      public void run() { 
       // While the SlidingDrawer is moving; do nothing. 
       while (mSlidingDrawer.isMoving()) 
       { 
        // Allow another thread to process its instructions. 
        Thread.yield(); 
       } 

       // When the SlidingDrawer is no longer moving; trigger mHandler. 
       mHandler.sendEmptyMessage(0); 
      } 
     }; 

     private Handler mHandler = new Handler() { 

      public void handleMessage(Message msg) { 

       if (mSlidingDrawer.isOpened()) { 
        // TODO: Case 1 - If the SlidingDrawer is completely opened... 
       } 
       else { 
        // TODO: Case 2 - If the SlidingDrawer is completely closed... 
       } 
      } 
     }; 

     @Override 
     public void onScrollEnded() { 
      new Thread(mRunnable).start(); 
     } 

     @Override 
     public void onScrollStarted() { 
      // TODO: When the user beings to scroll the SlidingDrawer... 
     } 
    }); 

참고 :에 대한 실행 지침을하고자하는 SlidingDrawer 당신에 대한 참조를 사용하여 참조를 mSlidingDrawer 교체합니다.