我正在使用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内容部分中包含的按钮,这没关系......
正如我上面所说,问题是在半折叠状态下,内容部分中包含的按钮没有收到事件...
您知道我该如何解决这个问题? 可以是一些滑动抽屉状态,避免在折叠时单击子项? 提前谢谢......
答案 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);
}
这是一个混乱的实现,但我认为基本概念是正确的。让我知道它对你有用!