SlidingDrawer ViewGroup を利用しようとしていますが、いくつかの障害に遭遇しました。SlidingDrawer にアタッチできるリスナーがいくつかあります。
OnDrawerScrollListener
OnDrawerOpenListener
OnDrawerCloseListener
onScrollStarted() は、SlidingDrawer ハンドルが最初にプルされるときに呼び出されます。
onScrollEnded() は、ユーザーがハンドル上で指の追跡を停止したときに呼び出されます (驚くべきことに、アニメーションが終了した後ではありません)。
onDrawerOpened() は、ユーザーが指を離し、引き出しがアニメーションで完全に開いたときにのみ呼び出されます。
onDrawerClosed() は、ユーザーが指を離し、引き出しがアニメーションで完全に閉じたときにのみ呼び出されます。
ドロワーが開き始めた瞬間にアクティビティのメイン ビューを無効にしたい (これは onScrollStarted() で実行できます)。引き出しが閉じているときに、アクティビティのメイン ビューを有効にしたいと考えています。ユーザーが引き出しを半分開いた状態でドラッグし、(指を離さずに) 引き出しを完全に閉じた場合、onDrawerClosed() が呼び出されないため、メイン ビューを再度有効にするかどうかを判断する方法がわかりません。onScrollEnded() でメイン ビューを有効にすることはできません。そのメソッドは、引き出しが完全に開いたり完全に閉じたりする直前に呼び出されるためです。
私が言及した 3 つのリスナー内の呼び出しの順序は次のとおりです。
onScrollStarted() onScrollEnded() onDrawerOpened() / onDrawerClosed()
明らかに、onScroll メソッドでは、タッチ イベントをリッスンしない限り、ドロワーが「開いている」か「閉じている」かを判断する方法がありません。それほど面倒にならずにこれを行う方法はありますか?
ありがとう。
編集:これが私のコードスニペットです。
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);
}
}