SemiClosedSlidingDrawer onClick在半折叠时未调度

时间:2013-08-14 08:08:47

标签: android slidingdrawer dispatchevent

我正在使用SemiClosedSlidingDrawer(http://pastebin.com/FtVyrcEb),我在内容部分添加了滑块顶部的一些按钮,这些按钮始终可见。

问题是只有当滑块完全打开时它们才是可点击的(或者点击事件)...当滑块是“半开”时,点击事件似乎没有显示到按钮...
我已经使用调试器检查了onInterceptTouchEvent()以及在两种情况下(打开/半折叠)以下代码

 @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; 
            }

 

返回false但仅在打开滑块时才会调度事件... 它检查相对于点击的(x,y)是否包含在从滑动抽屉的HandleButton视图开始创建的矩形中...

 

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

这显然是假的,因为我点击了slidedrawer内容部分中包含的按钮,这没关系......
正如我上面所说,问题是在半折叠状态下,内容部分中包含的按钮没有收到事件...

您知道我该如何解决这个问题? 可以是一些滑动抽屉状态,避免在折叠时单击子项? 提前谢谢......

1 个答案:

答案 0 :(得分: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);
}

这是一个混乱的实现,但我认为基本概念是正确的。让我知道它对你有用!