0

I am extend a SupportMapFragment which contain google map here, I lay my google map on a frameLayout according to How to handle onTouch event for map in Google Map API v2?. Ondraw()method is called , but the problem is rectangle is never been showed, even when I use setWillNotDraw(false); here.

I already got the right position of the rectangle, the only problem is it is not showed. Following is my most part of code:

Add-on:When I remove the google map it works as I expect, actually the rectangle drawed on the background frameLayout, so it will be covered by the map, now the way I solve the question is add a image view as a rectangle and dynamic change its size when touch moving. I have no idea how to draw directly on the top of this viewgroup(framelayout) at the moment

@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);
        }
Community
  • 1
  • 1
Haven
  • 7,808
  • 5
  • 25
  • 37

1 Answers1

0

You could wrap the Map in a FrameLayout containing also a Drawable (your rectangle). In that way, once you find where the rectangle shall be, you could hide and show it without having to redraw it.

You can see here for an example.

tiwiz
  • 327
  • 5
  • 19