Полигон свободной руки - смещен по оси Y (немного вниз) - PullRequest
0 голосов
/ 04 сентября 2018

Требование: я хотел бы нарисовать многоугольник от руки на карте, поэтому я использовал сенсорные события, как описано ниже:

<?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. Кажется, что все в порядке.

...