如何在android中的地图触摸位置动态绘制形状

时间:2013-06-07 05:22:36

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

我想绘制一个形状,无论用户触摸地图,都应该动态绘制。我对绘制这些形状一无所知。我怎么能实现这个目标?我可以通过画布完成吗?我正在使用MapFragment。

请看图片,

enter image description here

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

3 个答案:

答案 0 :(得分:3)

您可以通过添加覆盖地图的View来实现。

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

你已经完成了。

请注意,这将消耗所有可能使地图平移或缩放的事件。您将不得不采用其他方式与地图交互或使用某个标志启用消费事件。

答案 1 :(得分: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;
    

    }

  4. 像这样添加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上绘图,但似乎您正在绘制地图。

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

答案 2 :(得分:1)

答案是你不能。

正如您所看到的那样,地图将为平移/滚动操作消耗手势。

但是有一个技巧

  • 您可以在用户操作上放置标记(长按地图)
  • 设置标记可拖动并设置拖动侦听器
  • 提示用户拖动标记
  • 当用户拖动标记时,拖动侦听器将消耗拖动的点。
  • on Drag ends创建一个Lat-Long路径并绘制路径
  • 删除标记。