我正在尝试使用SlidingDrawer ViewGroup,但我遇到了一些障碍。我们可以将一些侦听器附加到SlidingDrawer:
OnDrawerScrollListener
OnDrawerOpenListener
OnDrawerCloseListener
最初拉动SlidingDrawer句柄时,会调用onScrollStarted()。
当用户停止在手柄上跟踪他们的手指时,会调用onScrollEnded()(令人惊讶的是,在动画结束后)。
仅当用户抬起手指并且抽屉已完全打开动画时,才会调用onDrawerOpened()。
仅当用户抬起手指并且抽屉已完全关闭动画时,才会调用onDrawerClosed()。
我想在抽屉开始打开时禁用我的Activity的主视图(可以在ScrollStarted()上完成)。当抽屉关闭时,我想启用我的活动的主视图。如果用户拖动抽屉半开,然后(不抬起他们的手指)拖动抽屉完全关闭,那么我不知道如何确定是否再次启用主视图,因为没有调用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);
}
}
答案 0 :(得分: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...
}
});
注意:将引用mSlidingDrawer
替换为您希望执行这些指令的SlidingDrawer的引用。
答案 1 :(得分:1)
如何在slidedrawer类中使用其他状态函数以及到目前为止所做的工作。我在考虑使用isOpened
或isMoving
等功能。您可以在inScrollEnded中调用这些来确定抽屉的状态并采取相应的操作。