Google Maps múltipla polígono que começando o segundo polígono a partir da primeira localização polígono

votos
0

Eu sou novo para o desenvolvimento Android. Eu estou tentando fazer os vários polígonos. Fiz, mas o segundo polígono está a começar a partir da extremidade do primeiro polígono. Eu listei as perguntas que se seguiram e a imagem que mostra o meu resultado.

Polygon múltipla No Mapa

Como desenhar polígono mão livre no Google map V2 no Android?

meu resultado

Aqui está o meu código:

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {

    private GoogleMap mMap;
    private static final LatLng MainLocation = new LatLng(40.828070, -111.904610);
    FrameLayout fram_map;
    FloatingActionButton fab;
    Boolean Is_MAP_Moveable = false;
    Projection projection;
    public double latitude;
    public double longitude;
    PolygonOptions rectOptions;
    ArrayList < LatLng > val = new ArrayList < > ();
    ArrayList < ArrayList < LatLng >> val2 = new ArrayList < > ();
    Polygon polygon;
    String LogName = XEL;

    @SuppressLint(ClickableViewAccessibility)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
        fram_map = (FrameLayout) findViewById(R.id.fram_map);
        fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (Is_MAP_Moveable) {
                    Is_MAP_Moveable = false;
                    if (val2.isEmpty()) {
                        val2.add(0, val);
                    } else {
                        val2.add(val2.size(), val);
                    }

                } else {
                    Is_MAP_Moveable = true;
                }
            }
        });
        fram_map.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (Is_MAP_Moveable) {
                    float x = event.getX();
                    float y = event.getY();

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

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

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

                    longitude = latLng.longitude;

                    int eventaction = event.getAction();
                    switch (eventaction) {
                        case MotionEvent.ACTION_DOWN:
                            val.add(new LatLng(latitude, longitude));
                        case MotionEvent.ACTION_MOVE:
                            val.add(new LatLng(latitude, longitude));
                        case MotionEvent.ACTION_UP:
                            Draw_Map();
                            break;
                    }

                } else {
                    Toast.makeText(MainActivity.this, Please start the zone, Toast.LENGTH_SHORT).show();
                }

                return Is_MAP_Moveable;

            }
        });
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        googleMap.setOnPolygonClickListener(new GoogleMap.OnPolygonClickListener() {
            @Override
            public void onPolygonClick(Polygon polygon) {
                Toast.makeText(MainActivity.this, polygon.getPoints().toString(), Toast.LENGTH_SHORT).show();
            }
        });
        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(MainLocation,
            20));
    }

    public void Draw_Map() {
        /*  for (int i = 0; i < val2.size(); i++) {
              rectOptions = new PolygonOptions();
              rectOptions.addAll(val2.get(i));
              rectOptions.strokeColor(Color.BLUE);
              rectOptions.strokeWidth(7);
              rectOptions.fillColor(Color.CYAN);
              polygon = mMap.addPolygon(rectOptions);
              polygon.setClickable(true);
          }*/
        rectOptions = new PolygonOptions();
        rectOptions.addAll(val);
        rectOptions.strokeColor(Color.BLUE);
        rectOptions.strokeWidth(7);
        rectOptions.fillColor(Color.CYAN);
        polygon = mMap.addPolygon(rectOptions);
        polygon.setClickable(true);
    }
}
Publicado 08/11/2018 em 06:42
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

A partir de uma visão geral, posso sugerir algumas coisas. Se você implementar essas coisas o problema pode ser resolvido:

  1. Fazer agora usuário a onClick separado. Use o OnTouch.

    //declare globally
    float init_x, init_y;
    float tolerance = 5;
    
    fram_map.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        init_x = event.getX();
                        init_y = event.getY();
                        break;
                    case MotionEvent.ACTION_MOVE:
    
                        break;
                    case MotionEvent.ACTION_UP:
                        float x = event.getX();
                        float y = event.getY();
                        Is_MAP_Moveable = Math.abs(init_x - x) > tolerance || Math.abs(init_y - y) > tolerance;
                        if(!Is_MAP_Moveable) {
                            int x_co = Math.round(x);
                            int y_co = Math.round(y);
    
                            projection = mMap.getProjection();
                            Point x_y_points = new Point(x_co, y_co);
                            LatLng latLng = mMap.getProjection().fromScreenLocation(x_y_points);
                            latitude = latLng.latitude;
                            longitude = latLng.longitude;
                            val.add(new LatLng(latitude, longitude));
                            Draw_Map();
                        } else {
                            Toast.makeText(MainActivity.this, "Please start the zone", Toast.LENGTH_SHORT).show();
                        }
                        break;
                }
                return Is_MAP_Moveable;
    
            }
        });
    
    1. Não precisa usar ArrayList de ArrayLists de LatLng - val2. Use val para desenhar o polígono.

    2. Limpar todos os polígonos no mapa antes swathing qualquer novo, porque você está empurrando elementos em um ArrayList. Use polygon.remove();antes de adicionar novo polígono.

Respondeu 08/11/2018 em 08:08
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more