android - 谷歌地图从第一个多边形位置开始第二个多边形的多个多边形
问题描述
我是 Android 开发的新手。我正在尝试做多个多边形。我做到了,但第二个多边形是从第一个多边形的末端开始的。我已经列出了我关注的问题以及显示我的结果的图像。
如何在 Android 的 Google 地图 V2 中绘制徒手多边形?
这是我的代码:
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);
}
}
解决方案
从概述中,我可以提出一些建议。如果您实施这些事情,问题可能会得到解决:
现在做一个单独的 onClick 用户。使用 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; } });
不需要使用 LatLng - val2 的 ArrayLists 的 ArrayList。使用 val 绘制多边形。
在绘制任何新多边形之前清除地图上的所有多边形,因为您正在推动 ArrayList 中的元素。
polygon.remove();
在添加新多边形之前使用。
推荐阅读
- database - 如何在elasticsearch的内部对象中获取与指定术语匹配的文档?
- node.js - Chart.js 与 Node.js
- python - HTTP 错误 429 请求过多 - 删除 cookie
- embedded - 错误:为 ATmega328P-XMINI 配置 avrdude(我认为作恶者是)->(avrdude:usbdev_send():写了 7 个字节中的 -5,err = 输入/输出错误)
- c - 什么是 int a=(i*+3); 以及c编译器将如何执行它?
- php - 使用删除按钮截断表格
- django - 为什么 Django ORM 需要 all() 用于 filter() 而不是 order_by()?
- c# - 在 C# 中读取和处理远程压缩的 xml 文件
- java - Hamcrest 匹配器检查响应 json 数组中的任何元素是否具有与 Rest Assured 中的特定值相同的属性值
- python - TypeError:'key' 是此函数用于排序图像的无效关键字参数