diff --git a/ln_jq_app/android/app/src/main/java/com/lnkj/ln_jq_app/NativeMapView.java b/ln_jq_app/android/app/src/main/java/com/lnkj/ln_jq_app/NativeMapView.java index d3dfc36..68d6b44 100644 --- a/ln_jq_app/android/app/src/main/java/com/lnkj/ln_jq_app/NativeMapView.java +++ b/ln_jq_app/android/app/src/main/java/com/lnkj/ln_jq_app/NativeMapView.java @@ -4,7 +4,9 @@ import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.graphics.Canvas; import android.graphics.Color; +import android.graphics.PorterDuff; import android.graphics.Typeface; import android.graphics.drawable.GradientDrawable; import android.os.Build; @@ -39,6 +41,7 @@ import com.amap.api.maps.CameraUpdateFactory; import com.amap.api.maps.LocationSource; import com.amap.api.maps.MapView; import com.amap.api.maps.MapsInitializer; +import com.amap.api.maps.model.BitmapDescriptor; import com.amap.api.maps.model.BitmapDescriptorFactory; import com.amap.api.maps.model.LatLng; import com.amap.api.maps.model.Marker; @@ -92,8 +95,7 @@ import okhttp3.Response; /** * 高德地图导航 */ -public class NativeMapView implements PlatformView, LocationSource, AMapLocationListener, - GeocodeSearch.OnGeocodeSearchListener, RouteSearch.OnRouteSearchListener, AMap.OnMarkerClickListener, Inputtips.InputtipsListener { +public class NativeMapView implements PlatformView, LocationSource, AMapLocationListener, GeocodeSearch.OnGeocodeSearchListener, RouteSearch.OnRouteSearchListener, AMap.OnMarkerClickListener, Inputtips.InputtipsListener { private static final String TAG = "NativeMapView"; private final FrameLayout container; @@ -316,8 +318,7 @@ public class NativeMapView implements PlatformView, LocationSource, AMapLocation tvStationName.setTextSize(18); tvStationName.setTextColor(Color.BLACK); tvStationName.setTypeface(Typeface.DEFAULT_BOLD); - LinearLayout.LayoutParams nameParams = new LinearLayout.LayoutParams( - 0, ViewGroup.LayoutParams.WRAP_CONTENT, 1.0f); + LinearLayout.LayoutParams nameParams = new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT, 1.0f); titleLayout.addView(tvStationName, nameParams); // 关闭按钮 (X) @@ -398,9 +399,7 @@ public class NativeMapView implements PlatformView, LocationSource, AMapLocation // 开始规划前隐藏输入框面板 searchArea.setVisibility(View.GONE); - RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo( - new LatLonPoint(startPoint.latitude, startPoint.longitude), - new LatLonPoint(endPoint.latitude, endPoint.longitude)); + RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(new LatLonPoint(startPoint.latitude, startPoint.longitude), new LatLonPoint(endPoint.latitude, endPoint.longitude)); RouteSearch.DriveRouteQuery query = new RouteSearch.DriveRouteQuery(fromAndTo, RouteSearch.DRIVING_SINGLE_DEFAULT, null, null, ""); routeSearch.calculateDriveRouteAsyn(query); } @@ -466,10 +465,7 @@ public class NativeMapView implements PlatformView, LocationSource, AMapLocation //防止 parseDouble 崩溃 if (latStr != null && !latStr.isEmpty() && lngStr != null && !lngStr.isEmpty()) { try { - finalDestinationLatLng = new LatLng( - Double.parseDouble(latStr), - Double.parseDouble(lngStr) - ); + finalDestinationLatLng = new LatLng(Double.parseDouble(latStr), Double.parseDouble(lngStr)); if (truckRouteData.destinationSite.name != null && !truckRouteData.destinationSite.name.isEmpty()) { finalDestinationName = truckRouteData.destinationSite.name; } @@ -582,9 +578,7 @@ public class NativeMapView implements PlatformView, LocationSource, AMapLocation json.put("plateNumber", plateNumber); json.put("hydrogenSiteId", selectedSiteId); - Request.Builder requestBuilder = new Request.Builder() - .url(mDebugUrl + "truck/truckRouteAlgorithm") - .post(RequestBody.create(json.toString(), MediaType.parse("application/json"))); + Request.Builder requestBuilder = new Request.Builder().url(mDebugUrl + "truck/truckRouteAlgorithm").post(RequestBody.create(json.toString(), MediaType.parse("application/json"))); if (token != null && !token.isEmpty()) { requestBuilder.addHeader("asoco-token", token); @@ -780,8 +774,11 @@ public class NativeMapView implements PlatformView, LocationSource, AMapLocation try { JSONObject item = array.getJSONObject(i); String id = item.getString("id"); - markStation(new LatLng(item.getDouble("latitude"), item.getDouble("longitude")), - item.getString("name"), item.getString("address"), id, false); + //推荐站点跳出 + if (selectedSiteId.equals(id)) { + continue; + } + markStation(new LatLng(item.getDouble("latitude"), item.getDouble("longitude")), item.getString("name"), item.getString("address"), id, false); } catch (Exception ignored) { } } @@ -798,13 +795,17 @@ public class NativeMapView implements PlatformView, LocationSource, AMapLocation } - private void markStation(LatLng latLng, String name, String address, String stationId, - boolean isRecommend) { - MarkerOptions markerOptions = new MarkerOptions() - .position(latLng).title(name) - .icon(BitmapDescriptorFactory.defaultMarker( - isRecommend ? BitmapDescriptorFactory.HUE_RED - : BitmapDescriptorFactory.HUE_GREEN)); + private void markStation(LatLng latLng, String name, String address, String stationId, boolean isRecommend) { + + String displayName = name; + if (displayName != null && displayName.length() > 7) { + displayName = displayName.substring(0, 7) + "..."; + } + + BitmapDescriptor icon = getMarkerIconWithText(mContext, displayName, isRecommend); + + MarkerOptions markerOptions = new MarkerOptions().position(latLng).icon(icon).anchor(0.5f, 0.8f); // 重点:调整锚点,确保图标尖端对准经纬度 + Marker m = aMap.addMarker(markerOptions); Map dataMap = new HashMap<>(); @@ -818,8 +819,14 @@ public class NativeMapView implements PlatformView, LocationSource, AMapLocation @Override public boolean onMarkerClick(Marker marker) { - Object obj = marker.getObject(); + //地图选点 + for (Marker m : stationMarkers) { + m.setIcon(BitmapDescriptorFactory.fromResource(m.equals(marker) ? R.drawable.ic_marker : R.drawable.ic_un_marker)); + } + + + Object obj = marker.getObject(); if (obj instanceof Map) { Map dataMap = (Map) obj; @@ -909,6 +916,61 @@ public class NativeMapView implements PlatformView, LocationSource, AMapLocation mapView.onDestroy(); } + public BitmapDescriptor getMarkerIconWithText(Context context, String text, boolean isRecommend) { + // 创建主容器 + LinearLayout container = new LinearLayout(context); + container.setOrientation(LinearLayout.VERTICAL); + container.setGravity(Gravity.CENTER_HORIZONTAL); + // 必须要给容器本身也设置一个基础参数,否则测量可能失败 + container.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)); + + // 文字部分:必须显式设置 LayoutParams + TextView textView = new TextView(context); + textView.setText(text); + textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12); + textView.setTextColor(Color.BLACK); + // 设置文字的参数为 WRAP_CONTENT + LinearLayout.LayoutParams textLp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); + textView.setLayoutParams(textLp); + container.addView(textView); + + // 图标部分:设置固定大小 + ImageView imageView = new ImageView(context); + imageView.setImageResource(isRecommend ? R.drawable.ic_marker : R.drawable.ic_un_marker); + + int size = dp2px(30); + LinearLayout.LayoutParams imgLp = new LinearLayout.LayoutParams(size, size); + imgLp.topMargin = dp2px(2); + imageView.setLayoutParams(imgLp); + imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); + container.addView(imageView); + + // --- 精准测量 --- + int spec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); + container.measure(spec, spec); + + // 获取测量后的实际宽高 + int measuredWidth = container.getMeasuredWidth(); + int measuredHeight = container.getMeasuredHeight(); + + // 如果测出来是 0,说明有问题 + if (measuredWidth <= 0 || measuredHeight <= 0) { + // 兜底逻辑:如果测量失败,给一个默认大小 + measuredWidth = dp2px(100); + measuredHeight = dp2px(60); + } + + container.layout(0, 0, measuredWidth, measuredHeight); + + // 绘制到 Bitmap + Bitmap bitmap = Bitmap.createBitmap(measuredWidth, measuredHeight, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + // 绘制前可以选清空背景(透明) + canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); + container.draw(canvas); + + return BitmapDescriptorFactory.fromBitmap(bitmap); + } /** * 辅助方法:创建带图标的文本项 @@ -970,7 +1032,7 @@ public class NativeMapView implements PlatformView, LocationSource, AMapLocation } // 1. 成本计算模式 (高亮绿色头部) - TextView item1 = createMenuItem(context, "成本计算模式", true); + TextView item1 = createMenuItem(context, "成本计算模式", false); item1.setOnClickListener(v -> switchMode("成本计算")); // 2. 送货规划模式 @@ -978,7 +1040,7 @@ public class NativeMapView implements PlatformView, LocationSource, AMapLocation item2.setOnClickListener(v -> switchMode("送货规划")); // 3. 加氢规划模式 - TextView item3 = createMenuItem(context, "加氢规划模式", false); + TextView item3 = createMenuItem(context, "加氢规划模式", true); item3.setOnClickListener(v -> switchMode("加氢规划")); menu.addView(item1); diff --git a/ln_jq_app/android/app/src/main/res/drawable/ic_marker.png b/ln_jq_app/android/app/src/main/res/drawable/ic_marker.png new file mode 100644 index 0000000..abafc0a Binary files /dev/null and b/ln_jq_app/android/app/src/main/res/drawable/ic_marker.png differ diff --git a/ln_jq_app/android/app/src/main/res/drawable/ic_un_marker.png b/ln_jq_app/android/app/src/main/res/drawable/ic_un_marker.png new file mode 100644 index 0000000..38dc60d Binary files /dev/null and b/ln_jq_app/android/app/src/main/res/drawable/ic_un_marker.png differ