我想建立与工作滚动以下布局并单击事件:Android:如何使SlidingDrawer中的片段中的CustomListView滚动并可点击?
我CustomSlidingDrawer.xml:
<com.project.util.CustomSliderDrawer
android:id="@+id/slidingDrawerHotelList"
android:layout_width="0dp"
android:layout_height="match_parent"
android:allowSingleTap="false"
android:content="@+id/content"
android:handle="@+id/handle"
android:orientation="horizontal" >
<RelativeLayout
android:id="@+id/handle"
android:layout_width="0dp"
android:layout_height="match_parent" >
<RelativeLayout
android:id="@+id/content"
android:layout_width="0dp"
android:layout_height="0dp" >
</RelativeLayout>
</RelativeLayout>
</com.project.util.CustomSliderDrawer>
元素的宽度是运行时设置。 这里我不得不提一下,我的真实内容在抽屉的句柄中,而内容只是一个虚拟物。我这样做是因为我无法隐藏手柄。或者让它看不见。所以,如果我想要轻扫手柄(我的内容)并拉动。在SlidingDrawer中,句柄是包含CustomListView的片段的占位符。 什么现在工作:我可以滚动SlidingDrawer。
我想获得什么行为: 在SlidingDrawer上,在X轴方向(垂直滑动)中检测到MotionEvents。如果检测到Y轴方向的MotionEvent,则Events应该转到我的CustomListView。即使onClicks应该通过ListView。
我已经试过:我读了很多:here,this page和this one 然后我试图把所有的导航控制中的主要活动,是什么让真正感觉到在我的眼前:
MainActivity:
slidingDrawer.setOnTouchListener(new OnTouchListener() {
int downX, downY;
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
downX = (int) event.getX();
downY = (int) event.getY();
break;
case MotionEvent.ACTION_MOVE:
int deltaX = downX - (int) event.getX();
int deltaY = downY - (int) event.getY();
if (Math.abs(deltaX) > Math.abs(deltaY)) {
Log.i(TAG, "scrollX direction");
isVerticalSwipe = true;
} else {
Log.i(TAG, "scrollY direction");
isVerticalSwipe = false;
}
break;
case MotionEvent.ACTION_UP:
break;
}
return false;
}
});
但是,当我尝试在这里返回“isVerticalSwipe”作为本地时,SlidingDrawer不能正常工作。 :-( 第二届尝试是截取自定义触摸事件的滑动抽屉:
CustomSlidingDrawer:
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.i(TAG, "onInterceptTouchEvent ACTION_DOWN");
xDistance = yDistance = 0f;
downX = (int) ev.getX();
downY = (int) ev.getY();
break;
case MotionEvent.ACTION_MOVE:
Log.i(TAG, "onInterceptTouchEvent ACTION_MOVE");
final int curX = (int) ev.getX();
final int curY = (int) ev.getY();
xDistance += Math.abs(curX - downX);
yDistance += Math.abs(curY - downY);
downX = curX;
downY = curY;
if (xDistance > yDistance)
return false;
}
return super.onInterceptTouchEvent(ev);
}
这里只发生在从未达到DOWN事件和移动事件 我也做一些trys与“dispatchTouchEvent”,但我没有成功
我知道,事件将通过我的意见的“层” - 从上到下 所以这将是完美的知道,我可以如何实现从我的CustomSlidingDrawer(=顶视图)上面的第一个链接构建,并且当检测到垂直滑动时保留一个nd处理它,如果它是一个水平滑动,那么请将它发送到CustomListView并在那里执行这些事件。
赞赏任何帮助,想法,想法或代码片段。 :) 谢谢!
[编辑]
我已经取得了一些进展。我现在将我的事件从SlidingDrawer下载到我的ListView。我可以滚动并在列表中单击 - 工作正常。但不幸的是,我的SlidingDrawer不再显示任何反应。这些生产线都在我的自定义SlidingDrawer:
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
gestureDetector = new GestureDetector(new MyGestureDetector());
if (gestureDetector.onTouchEvent(event)) {
return true;
} else if (event.getAction() == MotionEvent.ACTION_UP
|| event.getAction() == MotionEvent.ACTION_CANCEL) {
return false;
} else {
Log.i(TAG, "gestureDetector returned false");
return false;
}
}
class MyGestureDetector extends SimpleOnGestureListener {
@Override
public boolean onDown(MotionEvent e) {
Log.i(TAG, "onDown");
downX = (int) e.getX();
downY = (int) e.getY();
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
float deltaX = downX - e2.getX();
float deltaY = downY - e2.getY();
if (Math.abs(deltaX) > Math.abs(deltaY)) {
Log.i(TAG, "scrollX direction");
return true;
} else {
Log.i(TAG, "scrollY direction");
return false;
}
}
}
我真的不明白为什么它不工作,如果在X方向轻扫,然后我的抽屉里应该处理的姿态,BC我返回true。相反,每个事件都被转发到ListView。 我试图在“onInterceptTouchEvent”之前运行“dispatchTouchEvent”,但我没有成功。也许有更好的解决方案,而不是使用SlidingDrawer通过手指移动视图?