2012-10-12 90 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函数中处理布局转换。如果有人需要探测器,请不要犹豫,我会分享。

相关问题