Java 在谷歌地图上用手指自由画图

Java 在谷歌地图上用手指自由画图,java,android,google-maps,Java,Android,Google Maps,我想实现一个自定义模块在谷歌地图上免费绘图。说到实现,我发现googlemaponDrag()回调总是覆盖我的自定义onDrag()函数。我不太确定如何使用我的FrameLayoutonDrag()来覆盖贴图的点击和拖动运动 以下是我的工作: XML: MapWrapperLayout.java public class MapWrapperLayout extends FrameLayout { private OnDragListener mOnDragListener;

我想实现一个自定义模块在谷歌地图上免费绘图。说到实现,我发现googlemap
onDrag()
回调总是覆盖我的自定义
onDrag()
函数。我不太确定如何使用我的
FrameLayout
onDrag()
来覆盖贴图的点击和拖动运动

以下是我的工作:

XML:

MapWrapperLayout.java

public class MapWrapperLayout extends FrameLayout {
    private OnDragListener mOnDragListener;

    public MapWrapperLayout(Context context) {
        super(context);
    }

    public interface OnDragListener {
        public void onDrag(MotionEvent motionEvent);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (mOnDragListener != null) {
            mOnDragListener.onDrag(ev);
        }
        return super.dispatchTouchEvent(ev);
    }

    public void setOnDragListener(OnDragListener mOnDragListener) {
        this.mOnDragListener = mOnDragListener;
    }

}
MainActivity.java

package com.example.androidmapsv2;

import java.util.ArrayList;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnMapClickListener;
import com.google.android.gms.maps.GoogleMap.OnMapLongClickListener;
import com.google.android.gms.maps.GoogleMap.OnMarkerClickListener;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.Projection;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.Polygon;
import com.google.android.gms.maps.model.PolygonOptions;
import com.google.android.gms.maps.model.PolylineOptions;

import android.app.Activity;
import android.app.FragmentManager;
import android.graphics.Color;
import android.graphics.Point;
import android.location.Location;
import android.os.Bundle;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity 
    implements OnMapClickListener {

    final int RQS_GooglePlayServices = 1;
    private GoogleMap myMap;

    Location myLocation;
    TextView tvLocInfo;
    ArrayList<LatLng> val = new ArrayList<LatLng>();  
    boolean markerClicked;
    PolygonOptions polygonOptions;
    Polygon polygon;
    FrameLayout fram_map;
    CustomMapFragment myMapFragment ;
    boolean Is_MAP_Moveable;  
    Projection projection;
    public double latitude;
    public double longitude;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvLocInfo = (TextView)findViewById(R.id.locinfo);

        FragmentManager myFragmentManager = getFragmentManager();
         myMapFragment 
            = (CustomMapFragment)myFragmentManager.findFragmentById(R.id.map);

        if (myMapFragment != null) {

            myMapFragment.getMapAsync(new OnMapReadyCallback() {
                @Override
                public void onMapReady(GoogleMap map) {
                    loadMap(map);
                }
            });


            fram_map = (FrameLayout) findViewById(R.id.fram_map);
            Is_MAP_Moveable = false; // to detect map is movable 



        } else {
            Toast.makeText(this, "Error - Map Fragment was null!!", Toast.LENGTH_SHORT).show();

        }


    }

    public void Draw_Map() {


        myMap.addPolyline(new PolylineOptions()
                .addAll(val)
                .color(Color.parseColor( "#0971b2")).width(10f));

    }


    protected void loadMap(GoogleMap map) {
        // TODO Auto-generated method stub
        myMap = map;
        myMap.setMyLocationEnabled(true);

        myMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);

        myMap.setOnMapClickListener(this);
        //myMap.setOnMapLongClickListener(this);
        //myMap.setOnMarkerClickListener(this);

        markerClicked = false;
        fram_map.setOnTouchListener(new View.OnTouchListener() {   
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                float x = event.getX();
                float y = event.getY();

                int x_co = Math.round(x);
                int y_co = Math.round(y);

                projection = myMap.getProjection();
                Point x_y_points = new Point(x_co, y_co);

                LatLng latLng = myMap.getProjection().fromScreenLocation(x_y_points);
                latitude = latLng.latitude;

                longitude = latLng.longitude;

                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        // finger touches the screen
                        val.add(new LatLng(latitude, longitude));

                    case MotionEvent.ACTION_MOVE:
                        // finger moves on the screen
                        val.add(new LatLng(latitude, longitude));

                    case MotionEvent.ACTION_UP:
                       v.performClick();

                        // finger leaves the screen
                         Draw_Map();
                        break;
                }

                if (Is_MAP_Moveable == true) {
                    return true;

                } else {
                    return false;
                }
            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }


    @Override
    protected void onResume() {

        super.onResume();

        int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());

        if (resultCode == ConnectionResult.SUCCESS){
            Toast.makeText(getApplicationContext(), 
                    "isGooglePlayServicesAvailable SUCCESS", 
                    Toast.LENGTH_LONG).show();
        }else{
            GooglePlayServicesUtil.getErrorDialog(resultCode, this, RQS_GooglePlayServices);
        }

    }

    @Override
    public void onMapClick(LatLng point) {

        Is_MAP_Moveable = !Is_MAP_Moveable;
        Toast.makeText(getApplicationContext(), 
                Is_MAP_Moveable ? "drawing activated" : "drawing disabled", 
                Toast.LENGTH_SHORT).show();
//      tvLocInfo.setText(point.toString());
//      myMap.animateCamera(CameraUpdateFactory.newLatLng(point));
//      
//      markerClicked = false;
    }

//  @Override
//  public void onMapLongClick(LatLng point) {
//      tvLocInfo.setText("New marker added@" + point.toString());
//      myMap.addMarker(new MarkerOptions().position(point).title(point.toString()));
//      
//      markerClicked = false;
//  }
//
//  @Override
//  public boolean onMarkerClick(Marker marker) {
//      
//      if(markerClicked){
//          
//          if(polygon != null){
//              polygon.remove();
//              polygon = null;
//          }
//          
//          polygonOptions.add(marker.getPosition());
//          polygonOptions.strokeColor(Color.RED);
//          polygonOptions.fillColor(Color.BLUE);
//          polygon = myMap.addPolygon(polygonOptions);
//      }else{
//          if(polygon != null){
//              polygon.remove();
//              polygon = null;
//          }
//          
//          polygonOptions = new PolygonOptions().add(marker.getPosition());
//          markerClicked = true;
//      }
//      
//      return true;
//  }

}
package com.example.androidmapsv2;
导入java.util.ArrayList;
导入com.google.android.gms.common.ConnectionResult;
导入com.google.android.gms.common.GooglePlayServicesUtil;
导入com.google.android.gms.maps.GoogleMap;
导入com.google.android.gms.maps.GoogleMap.OnMapClickListener;
导入com.google.android.gms.maps.GoogleMap.OnMapLongClickListener;
导入com.google.android.gms.maps.GoogleMap.OnMarkerClickListener;
导入com.google.android.gms.maps.OnMapReadyCallback;
导入com.google.android.gms.maps.Projection;
导入com.google.android.gms.maps.model.LatLng;
导入com.google.android.gms.maps.model.Marker;
导入com.google.android.gms.maps.model.MarkerOptions;
导入com.google.android.gms.maps.model.Polygon;
导入com.google.android.gms.maps.model.polygonooptions;
导入com.google.android.gms.maps.model.PolylineOptions;
导入android.app.Activity;
导入android.app.FragmentManager;
导入android.graphics.Color;
导入android.graphics.Point;
导入android.location.location;
导入android.os.Bundle;
导入android.view.Menu;
导入android.view.MotionEvent;
导入android.view.view;
导入android.widget.FrameLayout;
导入android.widget.TextView;
导入android.widget.Toast;
公共类MainActivity扩展了活动
实现OnMapClickListener{
最终int RQS_GooglePlayServices=1;
私人谷歌地图;
位置;
TextView-tvLocInfo;
ArrayList val=新的ArrayList();
布尔标记单击;
多克隆选择;
多边形;
框架布局框架图;
CustomMapFragment-myMapFragment;
布尔值是可移动的;
投影;
公共双纬度;
公共双经度;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvLocInfo=(TextView)findViewById(R.id.locinfo);
FragmentManager myFragmentManager=getFragmentManager();
myMapFragment
=(CustomMapFragment)myFragmentManager.findFragmentById(R.id.map);
if(myMapFragment!=null){
myMapFragment.getMapAsync(新的OnMapReadyCallback(){
@凌驾
已于4月1日公开作废(谷歌地图){
负荷图(map);
}
});
fram_map=(框架布局)findViewById(R.id.fram_map);
Is_MAP_Moveable=false;//检测映射是否可移动
}否则{
Toast.makeText(这个“错误-映射片段为null!!”,Toast.LENGTH_SHORT.show();
}
}
公共空间绘制图(){
添加多段线(新的多段线选项()
.addAll(val)
.color(color.parseColor(#0971b2)).width(10f));
}
受保护的void loadMap(谷歌地图){
//TODO自动生成的方法存根
myMap=map;
myMap.setMyLocationEnabled(true);
setMapType(GoogleMap.MAP\u TYPE\u HYBRID);
myMap.setOnMapClickListener(这个);
//myMap.setOnMapLongClickListener(这个);
//setOnMarkerClickListener(这个);
markerClicked=false;
fram_map.setOnTouchListener(新视图.OnTouchListener(){
@凌驾
公共布尔onTouch(视图v,运动事件){
float x=event.getX();
float y=event.getY();
int x_co=数学圆(x);
int y_co=数学圆(y);
projection=myMap.getProjection();
点x_y_点=新点(x_co,y_co);
LatLng LatLng=myMap.getProjection().fromScreenLocation(x_y_点);
纬度=纬度;
经度=经度;
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:
//手指触摸屏幕
val.add(新纬度、经度);
case MotionEvent.ACTION\u移动:
//手指在屏幕上移动
val.add(新纬度、经度);
case MotionEvent.ACTION\u UP:
v、 performClick();
//手指离开屏幕
绘制地图();
打破
}
if(Is_MAP_Moveable==true){
返回true;
}否则{
返回false;
}
}
});
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.activity\u主菜单);
返回true;
}
@凌驾
受保护的void onResume(){
super.onResume();
int-resultCode=GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());
if(resultCode==ConnectionResult.SUCCESS){
Toast.makeText(getApplicationContext(),
“谷歌PlayServicesAvailable SUCCESS”,
Toast.LENGTH_LONG).show();
}否则{
GooglePlayServicesUtil.getErrorDialog(结果代码,this,RQS_GooglePlayServices);
}
}
@凌驾
公共空区(停车点){
Is\u MAP\u Moveable=!Is\u MAP\u Moveable;
Toast.makeText(getApplicationContext(),
是妈妈吗
public class MapWrapperLayout extends FrameLayout {
    private OnDragListener mOnDragListener;

    public MapWrapperLayout(Context context) {
        super(context);
    }

    public interface OnDragListener {
        public void onDrag(MotionEvent motionEvent);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (mOnDragListener != null) {
            mOnDragListener.onDrag(ev);
        }
        return super.dispatchTouchEvent(ev);
    }

    public void setOnDragListener(OnDragListener mOnDragListener) {
        this.mOnDragListener = mOnDragListener;
    }

}
package com.example.androidmapsv2;

import java.util.ArrayList;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnMapClickListener;
import com.google.android.gms.maps.GoogleMap.OnMapLongClickListener;
import com.google.android.gms.maps.GoogleMap.OnMarkerClickListener;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.Projection;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.Polygon;
import com.google.android.gms.maps.model.PolygonOptions;
import com.google.android.gms.maps.model.PolylineOptions;

import android.app.Activity;
import android.app.FragmentManager;
import android.graphics.Color;
import android.graphics.Point;
import android.location.Location;
import android.os.Bundle;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity 
    implements OnMapClickListener {

    final int RQS_GooglePlayServices = 1;
    private GoogleMap myMap;

    Location myLocation;
    TextView tvLocInfo;
    ArrayList<LatLng> val = new ArrayList<LatLng>();  
    boolean markerClicked;
    PolygonOptions polygonOptions;
    Polygon polygon;
    FrameLayout fram_map;
    CustomMapFragment myMapFragment ;
    boolean Is_MAP_Moveable;  
    Projection projection;
    public double latitude;
    public double longitude;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvLocInfo = (TextView)findViewById(R.id.locinfo);

        FragmentManager myFragmentManager = getFragmentManager();
         myMapFragment 
            = (CustomMapFragment)myFragmentManager.findFragmentById(R.id.map);

        if (myMapFragment != null) {

            myMapFragment.getMapAsync(new OnMapReadyCallback() {
                @Override
                public void onMapReady(GoogleMap map) {
                    loadMap(map);
                }
            });


            fram_map = (FrameLayout) findViewById(R.id.fram_map);
            Is_MAP_Moveable = false; // to detect map is movable 



        } else {
            Toast.makeText(this, "Error - Map Fragment was null!!", Toast.LENGTH_SHORT).show();

        }


    }

    public void Draw_Map() {


        myMap.addPolyline(new PolylineOptions()
                .addAll(val)
                .color(Color.parseColor( "#0971b2")).width(10f));

    }


    protected void loadMap(GoogleMap map) {
        // TODO Auto-generated method stub
        myMap = map;
        myMap.setMyLocationEnabled(true);

        myMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);

        myMap.setOnMapClickListener(this);
        //myMap.setOnMapLongClickListener(this);
        //myMap.setOnMarkerClickListener(this);

        markerClicked = false;
        fram_map.setOnTouchListener(new View.OnTouchListener() {   
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                float x = event.getX();
                float y = event.getY();

                int x_co = Math.round(x);
                int y_co = Math.round(y);

                projection = myMap.getProjection();
                Point x_y_points = new Point(x_co, y_co);

                LatLng latLng = myMap.getProjection().fromScreenLocation(x_y_points);
                latitude = latLng.latitude;

                longitude = latLng.longitude;

                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        // finger touches the screen
                        val.add(new LatLng(latitude, longitude));

                    case MotionEvent.ACTION_MOVE:
                        // finger moves on the screen
                        val.add(new LatLng(latitude, longitude));

                    case MotionEvent.ACTION_UP:
                       v.performClick();

                        // finger leaves the screen
                         Draw_Map();
                        break;
                }

                if (Is_MAP_Moveable == true) {
                    return true;

                } else {
                    return false;
                }
            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }


    @Override
    protected void onResume() {

        super.onResume();

        int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());

        if (resultCode == ConnectionResult.SUCCESS){
            Toast.makeText(getApplicationContext(), 
                    "isGooglePlayServicesAvailable SUCCESS", 
                    Toast.LENGTH_LONG).show();
        }else{
            GooglePlayServicesUtil.getErrorDialog(resultCode, this, RQS_GooglePlayServices);
        }

    }

    @Override
    public void onMapClick(LatLng point) {

        Is_MAP_Moveable = !Is_MAP_Moveable;
        Toast.makeText(getApplicationContext(), 
                Is_MAP_Moveable ? "drawing activated" : "drawing disabled", 
                Toast.LENGTH_SHORT).show();
//      tvLocInfo.setText(point.toString());
//      myMap.animateCamera(CameraUpdateFactory.newLatLng(point));
//      
//      markerClicked = false;
    }

//  @Override
//  public void onMapLongClick(LatLng point) {
//      tvLocInfo.setText("New marker added@" + point.toString());
//      myMap.addMarker(new MarkerOptions().position(point).title(point.toString()));
//      
//      markerClicked = false;
//  }
//
//  @Override
//  public boolean onMarkerClick(Marker marker) {
//      
//      if(markerClicked){
//          
//          if(polygon != null){
//              polygon.remove();
//              polygon = null;
//          }
//          
//          polygonOptions.add(marker.getPosition());
//          polygonOptions.strokeColor(Color.RED);
//          polygonOptions.fillColor(Color.BLUE);
//          polygon = myMap.addPolygon(polygonOptions);
//      }else{
//          if(polygon != null){
//              polygon.remove();
//              polygon = null;
//          }
//          
//          polygonOptions = new PolygonOptions().add(marker.getPosition());
//          markerClicked = true;
//      }
//      
//      return true;
//  }

}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

    <fragment
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="com.google.android.gms.maps.SupportMapFragment" />

    <View
        android:id="@+id/draggable"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true" />

</RelativeLayout>
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
    private GoogleMap mMap;
    private View draggableView;
    private List<LatLng> polylinePoints = new ArrayList<>();
    private Polyline polyline;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        draggableView = findViewById(R.id.draggable);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        draggableView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                LatLng position = mMap.getProjection().fromScreenLocation(
                        new Point((int) motionEvent.getX(), (int) motionEvent.getY()));

                if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                    if (polyline != null) {
                        polyline.remove();
                        polyline = null;
                    }
                    polyline = mMap.addPolyline(
                            new PolylineOptions().color(Color.RED).addAll(polylinePoints));
                } else if (motionEvent.getAction() == MotionEvent.ACTION_MOVE){
                    polylinePoints.add(position);
                    polyline.setPoints(polylinePoints);
                } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
                    // Close the polyline?
                }
                return true;
            }
        });
    }
}