2

我正在使用 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);

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

你知道我该如何解决这个问题吗?
可以是滑动抽屉的某种状态,以避免在折叠时点击孩子吗?
提前致谢...

4

1 回答 1

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

这是一个有点混乱的实现,但我认为基本概念是正确的。让我知道它是如何为您工作的!

于 2015-02-18T18:56:28.680 回答