Android地图开发:点击开始按钮时折线(Polyline)不显示的问题求助
问题分析与解决方案
你遇到的核心问题是Polyline(折线)需要至少两个坐标点才能在地图上可视化显示,同时还要确保点击按钮时已经获取到了有效的位置数据。以下是具体的问题拆解和修复方案:
问题根源
- 单点无法生成折线:当你点击一次按钮时,
points数组里仅添加了一个latLng坐标,单个点无法构成折线,因此地图上只会显示Marker,看不到折线。 - 位置有效性未校验:如果
onLocationResult还未触发(还没获取到用户位置),latLng或mLastLocation可能为null,此时添加点会导致无效操作甚至空指针异常。
修复步骤
1. 添加位置有效性校验
在按钮点击事件中先判断是否已获取到有效位置,避免无效操作:
btnStartRun.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 先判断是否已获取到有效位置 if (mLastLocation == null || latLng == null) { Toast.makeText(GooglsMapsActivity.this, "还未获取到位置,请稍后再试", Toast.LENGTH_SHORT).show(); return; } points.add(latLng); // 将当前位置加入轨迹点数组 redrawLine(); // Firebase 数据写入逻辑保持不变 myAuth = FirebaseAuth.getInstance(); DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference().child("OnlineUsers"); DatabaseReference currentUserDB = mDatabase.child(myAuth.getCurrentUser().getUid()); currentUserDB.child("CurrentLatitude").setValue(mLastLocation.getLatitude()); currentUserDB.child("CurrentLongitude").setValue(mLastLocation.getLongitude()); } });
2. 优化折线绘制逻辑
在redrawLine方法中增加判断,仅当轨迹点数量≥2时才绘制折线,避免无效操作:
private void redrawLine(){ mMap.clear(); // 清除之前的Marker和折线 addMarker(); // 添加当前位置的Marker // 只有当至少有2个点时才绘制折线 if (points.size() >= 2) { PolylineOptions options = new PolylineOptions().width(5).color(Color.BLUE).geodesic(true); for (LatLng point : points) { options.add(point); } line = mMap.addPolyline(options); // 绘制折线 } }
3. 进阶优化:自动追踪轨迹(适配跑步场景)
如果你的需求是记录用户跑步轨迹,仅靠点击按钮添加点并不符合实际使用习惯,可以增加一个追踪开关,自动收集位置点:
// 添加全局变量控制追踪状态 private boolean isTracking = false;
修改按钮点击事件为开始/停止切换:
btnStartRun.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { isTracking = !isTracking; if (isTracking) { btnStartRun.setText("停止跑步"); points.clear(); // 清空历史轨迹 } else { btnStartRun.setText("开始跑步"); } } });
修改onLocationResult,在追踪状态下自动收集位置点并刷新折线:
LocationCallback mLocationCallback = new LocationCallback() { @Override public void onLocationResult(LocationResult locationResult) { for (Location location : locationResult.getLocations()) { mLastLocation = location; latLng = new LatLng(location.getLatitude(), location.getLongitude()); mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); mMap.animateCamera(CameraUpdateFactory.zoomTo(15)); // 若处于追踪状态,自动添加位置点并刷新折线 if (isTracking) { points.add(latLng); redrawLine(); } } } };
验证效果
- 按基础方案修改后,点击两次按钮(确保每次都获取到有效位置),
points数组会有两个坐标点,折线即可正常显示。 - 进阶方案则会在用户点击"开始跑步"后,自动收集移动过程中的位置点,形成连续的轨迹折线,更符合跑步追踪的实际需求。
内容的提问来源于stack exchange,提问作者Theo0201
相关产品推荐
相关产品推荐

