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);
}
}
onScrollStarted()/onScrollEnded() isMoving()은 항상 true를 반환합니다. isOpened()는 드로어가 완전히 열린 상태 또는 완전히 닫힌 상태에서 onScroll 메서드를 시작했는지 여부에 따라 true/false를 반환합니다. 여기서 문제는 닫힌 서랍에서 시작하여 서랍을 열어 flinging하면 1. onScrollStarted() 2. onScrollEnded() 3. onDrawerOpened()입니다. # 2의 노트는 서랍이 열려 있는지 여부를 모르겠습니다. 닫힌 서랍에서 시작하여 서랍을 절반 열린 상태로 드래그 한 다음 다시 완전히 닫으면 1. onScrollStarted() 2. onScrollEnded()가됩니다. – mdupls
onScroll 메서드의 경우 1 (위)에서 isOpened()가 false를 반환합니다. onScroll 메서드의 경우 2 (위)에서 isOpened()는 false를 반환합니다. 이 두 가지 경우는 완전히 다르게 처리되어야합니다! 사례 1 - 기본보기를 비활성화 상태로 유지합니다. 사례 2 - 기본보기를 사용하도록 설정합니다. 이게 말이 돼? 감사. – mdupls
코드를 게시하면 onscrollEnded에서 isOpened가 작동하지 않는 이유를 이해하는 데 어려움을 겪고 있습니다. – Orlymee