【问题标题】:How to draw a shape dynamically on map touched location in android如何在android中的地图触摸位置上动态绘制形状
【发布时间】:2013-06-07 05:22:35
【问题描述】:

我想绘制一个形状,无论用户在哪里触摸地图,都应该动态绘制。我对绘制这些形状一无所知。我怎么能做到这一点?我可以通过画布完成这项工作吗?我正在使用 MapFragment。

请看图片,

请给我任何想法!任何帮助表示赞赏!

【问题讨论】:

  • 没人知道吗?请任何人!

标签: google-maps drawing android-maps-v2


【解决方案1】:

您可以通过在地图上添加View 来做到这一点。

  • 有一个 Polyline 对象(最初为空),它将成为您的行
  • 处理那个View上的onTouchEvent
  • 使用 Projection 将 x,y 从事件转换为 LatLng
  • 将新点添加到Polyline

你就完成了。

请注意,这会消耗所有原本会使地图平移或缩放的事件。您必须有其他方式与地图交互或使用某些标志启用消费事件。

【讨论】:

  • 谢谢。我会和这个一起去的。希望这会有所帮助。
  • @Mahe 都解决了吗?如果是的话,你能分享你的代码吗?我想做同样的事情。
  • @Eman87,我已经回答了您的问题并发布了我的代码。希望对你有用。
【解决方案2】:
  1. 在地图上添加一个 ImageView。你不能在地图上画画。
  2. ImageView 应该实现“OnTouchListener”
  3. 在地图上添加任何按钮,以便将 ImageView 带到前面,并且地图将在背景上可见。 4.点击ImageView时,执行如下操作

    public boolean onTouch(View v, MotionEvent event) {
    int action = event.getAction();
    Point p = new Point();
    path = new Path();
    float upX;
    float upY;
    
    switch (action) {
    case MotionEvent.ACTION_DOWN:
        laArray = "";
        lnArray = "";
        canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
        downx = event.getX();
        downy = event.getY();
        eventX = downx;
        eventY = downy;
        Log.d("", "startx" + eventX);
        p.x = (int) downx;
        p.y = (int) downy;
        LatLng latlngpoint;
        latlngpoint = map.getProjection().fromScreenLocation(p);
        break;
    case MotionEvent.ACTION_MOVE:
        upx = event.getX();
        upy = event.getY();
        canvas.drawLine(downx, downy, upx, upy, paint);
        drawable.invalidate();
        downx = upx;
        downy = upy;
        Log.d("", "Action_Move");
        Log.d("", "downx, downy: " + downx + "," + downy);
        Log.d("", "upx, upy: " + upx + "," + upy);
        p.x = (int) upx;
        p.y = (int) upy;
        LatLng latlngpoint1;
        latlngpoint1 = map.getProjection().fromScreenLocation(p);           
        break;
    case MotionEvent.ACTION_UP:
        upX = event.getX();
        upY = event.getY();
        p.x = (int) upX;
        p.y = (int) upY;
        Log.d("", "Action Up");
        canvas.drawLine(eventX, eventY, upX, upY, paint);
        LatLng latlngpoint2;
        latlngpoint2 = map.getProjection().fromScreenLocation(p);           
        drawable.invalidate();
    
        // When finger is Up, Start UserSearch.
    
        StartUserSearch(); //user defined function
        return true;
    case MotionEvent.ACTION_CANCEL:
        break;
    default:
        break;
    }
    
    return true;
    

    }

像这样添加 ImageView,

   <ImageView
    android:id="@+id/viewOnMap"
    style="@style/AppTheme"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    >

  </ImageView> 

所以,当点击地图上的绘制按钮时,

 ImageView drawable= (ImageView) findViewById(R.id.viewOnMap);
 drawable.setVisibility(View.VISIBLE);
 drawable.bringToFront();

现在,您应该可以在 imageView 上绘图,但您似乎是在地图上绘图。

您可以根据需要修改代码。希望这会有所帮助。

【讨论】:

  • 非常感谢您的回答。我有个问题。当您返回地图并拖动它以显示任何其他位置时,所绘制的线是随地图移动,还是仍然稳定在其位置并且地图在其下方移动?
  • @Eman87,当我回到地图时,我正在清除绘制的线。当用户更改搜索位置,如果用户想在该位置搜索,用户将再次点击地图上的绘制按钮,并允许用户在 imageView 上进行绘制。
  • laArray 变量的用途是什么,我遇到了错误。
  • @jyomin 我正在使用这个变量来保存所有属于绘制形状的纬度和经度值。我的搜索基于该数组。我需要经度和纬度的数组。
  • 我已经实现了你的 onTouch 方法,但是在 imageview 上没有绘制任何东西。请帮助
【解决方案3】:

答案是你不能。

如您所见,地图将使用手势进行平移/滚动操作。

但是有一个技巧

  • 您可以在用户操作上放置标记(在地图上长按)
  • 设置可拖动标记并设置拖动监听器
  • 提示用户拖动标记
  • 拖动监听器将在用户拖动标记时消耗拖动的点。
  • 在拖曳末端用经纬度创建路径并绘制路径
  • 移除标记。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    相关资源
    最近更新 更多