Требование: я хотел бы нарисовать многоугольник от руки на карте, поэтому я использовал сенсорные события, как описано ниже:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:map="http://schemas.android.com/apk/res-auto"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/map_frame_layout"
tools:context=".fragment.MapFragment">
<include layout="@layout/maps_main_content"/>
<FrameLayout
android:id="@+id/frameLayoutMaps"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
layout maps_main_content содержит еще один FrameLayout для рисования многоугольника.
Ниже приведен код, который я использовал для рисования многоугольника и обработки событий касания.
Я использовал для логической переменной Is_MAP_Moveable, чтобы включить / отключить режим рисования.
private Polygon polygon;
private List<LatLng> val = new ArrayList<>();
Boolean Is_MAP_Moveable = false;
private FrameLayout mapLayout;
mapLayout = rootView.findViewById(R.id.frameLayoutForDrawing);
mapLayout.setOnTouchListener((v, event) -> {
if (Is_MAP_Moveable) {
float x = event.getX();
float y = event.getY();
int[] location = new int[2];
v.getLocationInWindow(location);
//return new Point((int) viewX, (int) viewY);
float screenX = event.getX();
float screenY = event.getY();
float viewX = screenX - v.getLeft();
float viewY = screenY - v.getTop();
int x_co = Math.round(x);
int y_co = Math.round(y);
android.graphics.Point x_y_points = new android.graphics.Point((int) viewX, (int) viewY);//new android.graphics.Point(x_co, y_co);
LatLng latLng = googleMaps.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));
break;
case MotionEvent.ACTION_MOVE:
// finger moves on the screen
val.add(new LatLng(latitude, longitude));
break;
case MotionEvent.ACTION_UP:
// finger leaves the screen
MapFragment.this.Draw_Map();
break;
}
}
return Is_MAP_Moveable;
});
public void Draw_Map() {
if (polygon != null)
polygon.remove();
val.add(val.get(0));//to make to it complete
rectOptions = new PolygonOptions();
rectOptions.addAll(val);
rectOptions.strokeColor(Color.BLUE);
rectOptions.fillColor(Color.TRANSPARENT);
polygon = googleMaps.addPolygon(rectOptions);
val.clear();
Is_MAP_Moveable = false;
}
Я могу видеть многоугольник, но он смещен вниз по оси Y. Кажется, что все в порядке.