拖动时获取触摸位置
我有一些我喜欢拖动的视图。视图在 之内的一个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来计算组合 与视图位置的触摸的位置 。但是,还有没有更好的方法去?
好的,因为似乎没有更简单的答案,我将为更多的读者提供我自己的相对简单的解决方案,而不需要手势检测。
首先,您需要接收拖动事件的视图,如果自身(或至少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上实现了平滑滚动。 因此,用户可以将项目拖出列表,并通过将项目拖动到列表视图的顶部或底部来滚动列表。 如果有人对此感兴趣,我可以提供进一步链接到 实施。
干杯。
谢谢!我刚才遇到了同样的问题 – Markus
嗨,请你适当的实施流程我坚持在这种类型的问题,如果它的演示,那么它会很好。 –
欢迎来设计自己的自定义手势。我会环顾人们如何做手势。这是一个投掷的例子http://stackoverflow.com/questions/4139288/android-how-to-handle-right-to-left-swipe-gestures或者你可以做的Ps:但如果你拖动的东西这是一个布局中的几个级别,你需要做一些计算来获得触摸位置 – Xjasz