Android 半折叠时未调度半关闭DSLIDIGDRAWER onClick

Android 半折叠时未调度半关闭DSLIDIGDRAWER onClick,android,slidingdrawer,dispatchevent,Android,Slidingdrawer,Dispatchevent,我使用了一个半封闭的dSlider(),并且在内容部分添加了一些按钮,这些按钮位于滑块顶部,它们总是可见的 问题是,只有当滑块完全打开时,它们才可单击(或调度单击事件)当滑块处于“半打开”状态时,单击事件似乎不会显示到按钮我已经使用调试器检查了onInterceptTouchEvent()中的代码,并且在这两种情况下(打开/半折叠)都检查了以下代码 @Override public boolean onInterceptTouchEvent(MotionEvent event) {

我使用了一个半封闭的dSlider(),并且在内容部分添加了一些按钮,这些按钮位于滑块顶部,它们总是可见的

问题是,只有当滑块完全打开时,它们才可单击(或调度单击事件)
当滑块处于“半打开”状态时,单击事件似乎不会显示到按钮
我已经使用调试器检查了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)是否包含在从滑动抽屉的把手按钮视图开始创建的矩形中

 

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

这显然是错误的,因为我点击了slidingdrawer内容部分中的一个按钮,没关系。。。
正如我上面所说的,问题在于,在半折叠状态下,内容部分中包含的按钮不接收事件

你知道我如何解决这个问题吗?
滑动抽屉的某些状态是否可以避免在折叠时单击儿童?

提前谢谢…

好的,我想我已经想出了一个办法

首先,您需要修改
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);
}