我想建立與工作滾動以下佈局並單擊事件: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通過手指移動視圖?