【问题标题】:Draw rectangle on google map在谷歌地图上绘制矩形
【发布时间】:2014-01-25 17:31:25
【问题描述】:

我在这里扩展了一个包含谷歌地图的 SupportMapFragment,我根据How to handle onTouch event for map in Google Map API v2? 将我的谷歌地图放在 frameLayout 上。 Ondraw() 方法被调用,但问题是矩形从未被显示,即使我使用 setWillNotDraw(false);在这里。

我已经得到了矩形的正确位置,唯一的问题是它没有显示出来。以下是我的大部分代码:

附加组件:当我删除谷歌地图时,它按预期工作,实际上是在背景框架布局上绘制的矩形,所以它会被地图覆盖,现在我解决问题的方法是添加一个图像视图为矩形,并且在触摸移动时动态更改其大小。我现在不知道如何直接在这个视图组(framelayout)的顶部绘制

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = super.onCreateView(inflater, container, savedInstanceState);
    //stash reference to google map 
    mGoogleMap = getMap();
    //show the location
    mGoogleMap.setMyLocationEnabled(true);
    mTouchView = new TouchableWrapper(getActivity());
    mTouchView.addView(view);

    return mTouchView;
}

private class TouchableWrapper extends FrameLayout {

    //box is used to illustrate the drawing box, the painter is used to set the color of the box.
    private Box mCurrentBox = null;
    private Paint mBoxPaint;

    public TouchableWrapper(Context context) {
        super(context);
        mBoxPaint = new Paint();
        mBoxPaint.setColor(0xffff0000);
    //  mBoxPaint.setStrokeMiter(20);
        mBoxPaint.setStrokeWidth(8);    
        this.setWillNotDraw(false);
        setWillNotDraw(false);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        // decide when the child should hold the motion event.
        return true;    //always let the relative layout to hold the motion event.
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        PointF curr = new PointF(event.getX(), event.getY());
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                 mMapIsTouched = true;
                mCurrentBox = new Box(curr);//original code for draw Rectangle.
                Log.d(TAG, "action.down box is"+mCurrentBox);
                break;

            case MotionEvent.ACTION_MOVE:
                Log.i(TAG, "action_move");
                if (mCurrentBox != null) {
                    mCurrentBox.setmCurrent(curr);
                    Log.d(TAG, "action.move box is"+mCurrentBox);
                    this.invalidate();  //TODO
                }
                break;

            case MotionEvent.ACTION_UP:
                Log.i(TAG, "action_up");
                mMapIsTouched = false;
                mCurrentBox = null;
                break;
                }
            return true;
        }

    @Override
    protected void onDraw(Canvas canvas) {
        float left = 0;
        float right = 0;
        float top = 0;
        float bottom = 0;
        if (mCurrentBox!=null) {
             left = Math.min(mCurrentBox.getmOrigin().x, mCurrentBox.getCurrent().x) ;
             right = Math.max(mCurrentBox.getmOrigin().x, mCurrentBox.getCurrent().x) ;
             top = Math.min(mCurrentBox.getmOrigin().y, mCurrentBox.getCurrent().y) ;
             bottom = Math.max(mCurrentBox.getmOrigin().y, mCurrentBox.getCurrent().y) ;
            canvas.drawRect(left, top, right, bottom, mBoxPaint);
            }
        Log.i(TAG, "value is"+left+right+top+bottom);
        }

【问题讨论】:

  • 我不确定,但您可能需要在您的 onDraw 方法中调用 super.onDraw(canvas)

标签: java android touch overlay android-framelayout


【解决方案1】:

您可以将地图包装在一个 FrameLayout 中,其中还包含一个 Drawable(您的矩形)。这样一来,一旦找到矩形的位置,就可以隐藏和显示它,而无需重新绘制它。

您可以查看here 的示例。

【讨论】:

  • 谢谢你的建议,我查过了,可以替代
猜你喜欢
  • 2016-10-18
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多