android – 拖动时获取触摸位置

前端之家收集整理的这篇文章主要介绍了android – 拖动时获取触摸位置前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我有一些观点,我喜欢拖延.意见在内
LinearLayout,它本身位于scrollview中.

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

经过长时间的点击,我开始使用
查看内置侦听器startDrag

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

我也能够获得阻力的相对位置
在目前徘徊的观点上

view.setOnDragListener(new OnDragListener() {
        @Override
        public boolean onDrag(View v,DragEvent event) {
            //get event positions
        }
    });

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

我需要的是手指的位置,而阻力发生.不幸的是,所有onTouchEvents都会在拖动时消耗掉.

有人知道我是如何让这个工作的吗?

Ps:我目前使用的一种方式(种类)是计算
通过dragEvent.relativePosition组合触摸的位置
与观点位置.但是,还有更好的方法吗?

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

首先,您需要接收拖动事件的视图,然后是第二个
拖动事件ifself(或至少x和y坐标).
通过获取视图位置和一些简单的添加,您可以获得
原始触摸位置.

使用show pointer position developer选项测试此方法
提供正确的数据.

计算方法如下:

/**
 * @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上实现了平滑滚动.
因此,用户可以将项目拖出列表,并通过将项目拖动到列表视图的顶部或底部来滚动列表.
如果有人对此感兴趣,我可以提供进一步的链接
实现.

干杯.

猜你在找的Android相关文章