我有一个SlidingPaneLayout
的活动,里面有两个片段:左边是ListView
,右边是MapFragment
。
如何拦截生成的触摸事件,以便用户可以在不关闭面板的情况下移动地图?
我想用来关闭/打开右侧面板的唯一区域是第四个区域。在该区域的右侧,我想移动地图。
由于
EDIT2:
好的,现在我想出了如何正确地继承SlidingPaneLayout,现在的问题是如何正确捕获触摸事件:
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN
&& event.getX() > (getWidth() / 6)) {
return false;
}
return super.onTouchEvent(event);
}
使用此代码我无法滑动地图,它仍然是固定的。 问题是我只想在选择右侧面板时拦截触摸(换句话说,只有在显示地图时)。
答案 0 :(得分: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而不是
答案 1 :(得分:2)
我终于解决了这个问题: 简单地覆盖此方法并控制SlidingPaneLayout是关闭还是打开(在我的情况下,我有一个布尔字段值“open”)
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (!homeActivity.open && event.getX() > (getWidth() / 5)) {
return false;
}
return super.onInterceptTouchEvent(event);
}