android - 无法使用 Osmdroid 实现 onTouchEvent(拖放)

标签 android android-mapview hittest touch-event osmdroid

我一直在尝试实现 OnTouchEvent,以便在用户移动(拖放)覆盖项时使用react。

我在 Osmdroid 网站上发现了类似的东西:http://code.google.com/p/osmdroid/issues/detail?id=225 .我正在使用那里的代码作为引用,但仍然不适合我,然后我的应用程序在进入 hitTest 时崩溃了。

有什么建议吗?谢谢。

public boolean onTouchEvent(MotionEvent event, MapView mapView) {

    final int action = event.getAction();
    final int x = (int) event.getX();
    final int y = (int) event.getY();

    final Projection pj = mapView.getProjection();

    boolean result = false;
    //Object TAG;
    //Log.d(TAG, "onTouchEvent entered");

    System.out.println("onTouchEvent!");        
    Point p = new Point(0,0);
    Point t = new Point(0,0);

    //System.out.print(MotionEvent.ACTION_DOWN);
    //System.out.print(action);

    if (action == MotionEvent.ACTION_DOWN) {

        System.out.println("Action Down!");

        for (OverlayItem item : mOverlays) {

            // Create a new GeoPoint from pixel coordinates (x, y, pointReuse):
            //pj.fromMapPixels(x, y, t);

            // Convert the given GeoPoint to onscreen pixel coordinates (GeoPoint, pointOut):
            pj.toPixels(item.getPoint(), p);

            //System.out.println(t.x);
            //System.out.println(p.x);

            //System.out.println(t.y);
            //System.out.println(p.y);

            defaultMarker = item.getDrawable();

            if (hitTest(item, defaultMarker, x - p.x, y - p.y)) {
                System.out.println("Action Down -> IF!");
                result = true;
                inDrag = item;
                mOverlays.remove(inDrag);
                populate();

                xDragTouchOffset = 0;
                yDragTouchOffset = 0;

                setDragImagePosition(x, y);
                dragImage.setVisibility(View.VISIBLE);

                xDragTouchOffset = t.x - p.x;
                yDragTouchOffset = t.y - p.y;

                break;
            }
        }

    } 

    else if (action == MotionEvent.ACTION_MOVE && inDrag != null) {
        //dragImage.setVisibility(View.VISIBLE);
        setDragImagePosition(x, y);
        System.out.println("Action Move!");
        result = true;
    } 

    else if (action == MotionEvent.ACTION_UP && inDrag != null) {
        dragImage.setVisibility(View.GONE);

        GeoPoint pt = (GeoPoint) pj.fromPixels(x - xDragTouchOffset, y - yDragTouchOffset);
        OverlayItem toDrop = new OverlayItem(inDrag.getTitle(),
                inDrag.getSnippet(), pt);

        mOverlays.add(toDrop);
        populate();

        inDrag = null;
        result = true; 

        pj.fromMapPixels(x, y, t);

        if((t.x - p.x) == xDragTouchOffset && (t.y - p.y) == yDragTouchOffset) {
            System.out.println ("Do something here if desired because we didn't move item " + toDrop.getTitle() );
        }

        System.out.println("Action Up!");

    }
    System.out.print(inDrag);
    return (result || super.onTouchEvent(event, mapView));
}

private void setDragImagePosition(int x, int y) {
    RelativeLayout.LayoutParams lp=
            (RelativeLayout.LayoutParams)dragImage.getLayoutParams();
    lp.setMargins(x-xDragImageOffset-xDragTouchOffset,
            y-yDragImageOffset-yDragTouchOffset, 0, 0);
    dragImage.setLayoutParams(lp);
    }

最佳答案

我让上面的代码工作了。我只注意到我的工作代码和你的工作代码有两点不同。一个是您发送的 hitTest 参数,尝试更改

if (hitTest(item, defaultMarker, x - p.x, y - p.y)) {

if (hitTest(item, defaultMarker, t.x - p.x, t.y - p.y)) {

第二个是你应该取消注释 pj.fromMapPixels(x, y, t);

如果您想在拖动图像时看到图像,您也应该取消注释 dragImage.setVisibility(View.VISIBLE);

关于android - 无法使用 Osmdroid 实现 onTouchEvent(拖放),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7986025/

相关文章:

android - SD卡卸载android时获取广播接收

java - 在两个 fragment 之间传递数据

android - 你好 MapView,移动标记

wpf - 当鼠标经过 ContextMenu 或验证错误时,IsMouseOver 返回 False?

wpf - 跨 Windows 的 HotTest?

iphone - 是否有用于 CALayer HitTest 的 MouseChildren?

android - 如何在 ListView 中的每个第 n 个位置显示一个 AdView

android - 如何在 android 中刷新和加载来自 json 提要的数据?

android - fragment 类中的谷歌地图 onClick 事件

android - 旋转设备时 RecyclerView/MapView 崩溃