2

我有一个 Activity SlidingPaneLayout,里面有两个片段:ListView左侧的 a 和MapFragment右侧的 a 。如何拦截生成的触摸事件,以便用户可以在不关闭面板的情况下移动地图?

我想用来关闭/打开右侧面板的唯一区域是前四分之一。在该区域的右侧,我想移动地图。

谢谢

编辑2:

好的,现在我想出了如何正确继承 SlidingPaneLayout,现在的问题是如何正确捕获触摸事件:

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN
            && event.getX() > (getWidth() / 6)) {
        return false;
    }
    return super.onTouchEvent(event);
}

使用此代码,我无法滑动地图,它仍然是固定的。问题是我只想在选择右面板时拦截触摸(换句话说,只有在显示地图时)。

4

2 回答 2

2

SlidingPaneLayout 有它自己的触摸监听器,因此当您通过调用 setOnTouchListener(它是超类 View 的方法)重置它时,您将失去所有特定于 SlidingPaneLayout 的 onTouch 行为。

-------------------------------

这是一个尝试:制作您自己的 SlidingPaneLayout:
构造函数应该是这样的,以便在 xml 布局中使用您的视图

public class MySlidingPaneLayout extends SlidingPaneLayout{

    public MySlidingPaneLayout(Context context, AttributeSet attrs) {
        super(context, attrs);

    }

    @Override
    public boolean onTouchEvent(MotionEvent event){
        if (event.getX() < widthPIX / 6) {
             return super.onTouchEvent(event);// here it works as a normal SlidingPaneLayout
        }
        return false; // here it returns false so that another event's listener should be called, in your case the MapFragment listener
    }
}

并在您的代码中添加 MySlidingPaneLayout

于 2013-09-21T13:54:26.317 回答
2

我终于解决了这个问题:只需覆盖此方法并控制 SlidingPaneLayout 是关闭还是打开(在我的情况下,我有一个布尔字段值“打开”)

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    if (!homeActivity.open && event.getX() > (getWidth() / 5)) {
            return false;
        }
    return super.onInterceptTouchEvent(event);
}
于 2013-09-21T15:00:55.720 回答