2012-10-12 30 views
1

我想建立與工作滾動以下佈局並單擊事件: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。

我已經試過:我讀了很多:herethis pagethis 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通過手指移動視圖?

回答

0

好吧,經過大量的眼淚,汗水和血液之後,我終於找到了適用於我的解決方案:我不再採用SlidingDrawer並通過更改LayoutParams來移動我的佈局。 通過「dispatchTouchEvent」我可以訪問我的列表。

@Override 
public boolean dispatchTouchEvent(MotionEvent ev) { 
    if (mGestureDetector.onTouchEvent(ev)) { 
     return true; 
    } 
    if (ev.getAction() == MotionEvent.ACTION_UP) { 
     Log.i(TAG, "ACTION_UP"); 
     Log.i(TAG, "getLeft: " + getLeft()); 
     if (getLeft() < 280) { 
      // run ani to left 
     } else { 
      // run ani to right 
     } 
    } 

    return super.dispatchTouchEvent(ev); 
} 

而在我的手勢檢測器中,我在覆蓋的onScroll函數中處理佈局轉換。如果有人需要探測器,請不要猶豫,我會分享。

相關問題