2015-05-29 58 views
4

我有一些我喜欢拖动的视图。视图在 之内的一个LinearLayout,它本身在滚动视图内。拖动时获取触摸位置

我想获得当前手指的位置(触摸),以 在我的滚动视图上进行平滑滚动,具体取决于当前拖动的高度 。

我长时间点击与 查看内置的监听器启动后我draggin的startDrag

view.startDrag(null, shadowBuilder, view, 0); 

我也能得到当前由

徘徊在视图中拖动 的relativ位置
view.setOnDragListener(new OnDragListener() { 
     @Override 
     public boolean onDrag(View v, DragEvent event) { 
      //get event positions 
     } 
    }); 

但是,这只适用于当前拖动阴影在 和DragEvent只提供相对位置,而不是原始位置的视图。

我需要的是手指的位置,而拖动发生。不幸的是,所有的onTouchEvents在拖拽时都会被占用。

有没有人知道我如何得到这个工作?

PS:该作品(种),我目前使用的一种方式是经由dragEvent.relativePosition来计算组合 与视图位置的触摸的位置 。但是,还有没有更好的方法去?

+1

欢迎来设计自己的自定义手势。我会环顾人们如何做手势。这是一个投掷的例子http://stackoverflow.com/questions/4139288/android-how-to-handle-right-to-left-swipe-gestures或者你可以做的Ps:但如果你拖动的东西这是一个布局中的几个级别,你需要做一些计算来获得触摸位置 – Xjasz

回答

10

好的,因为似乎没有更简单的答案,我将为更多的读者提供我自己的相对简单的解决方案,而不需要手势检测。

首先,您需要接收拖动事件的视图,如果自身(或至少x和y坐标)处于第二个拖动事件的位置。 随着视图位置的提取和一些简单的添加,您可以获得原始触摸位置 。

该方法是用显示指针位置开发人员选项 进行测试以提供正确的数据。

的计算方法如下:

/** 
* @param item the view that received the drag event 
* @param event the event from {@link android.view.View.OnDragListener#onDrag(View, DragEvent)} 
* @return the coordinates of the touch on x and y axis relative to the screen 
*/ 
public static Point getTouchPositionFromDragEvent(View item, DragEvent event) { 
    Rect rItem = new Rect(); 
    item.getGlobalVisibleRect(rItem); 
    return new Point(rItem.left + Math.round(event.getX()), rItem.top + Math.round(event.getY())); 
} 

调用此方法您onDragListener实现内部:

@Override 
public boolean onDrag(View v, DragEvent event) { 
    switch (event.getAction()) { 
     case DragEvent.ACTION_DRAG_STARTED: 
      //etc etc. do some stuff with the drag event 
      break; 
     case DragEvent.ACTION_DRAG_LOCATION: 
      Point touchPosition = getTouchPositionFromDragEvent(v, event); 
      //do something with the position (a scroll i.e); 
      break; 
     default: 
    } 
    return true; 
} 

Addtional: 如果你想确定的触摸是否内具体看来,你可以用 做这样的事情:

public static boolean isTouchInsideOfView(View view, Point touchPosition) { 
    Rect rScroll = new Rect(); 
    view.getGlobalVisibleRect(rScroll); 
    return isTouchInsideOfRect(touchPosition, rScroll); 
} 

public static boolean isTouchInsideOfRect(Point touchPosition, Rect rScroll) { 
    return touchPosition.x > rScroll.left && touchPosition.x < rScroll.right //within x axis/width 
      && touchPosition.y > rScroll.top && touchPosition.y < rScroll.bottom; //withing y axis/height 
} 

我也基于此解决方案在listview上实现了平滑滚动。 因此,用户可以将项目拖出列表,并通过将项目拖动到列表视图的顶部或底部来滚动列表。 如果有人对此感兴趣,我可以提供进一步链接到 实施。

干杯。

+1

谢谢!我刚才遇到了同样的问题 – Markus

+0

嗨,请你适当的实施流程我坚持在这种类型的问题,如果它的演示,那么它会很好。 –