调整地图选点
This commit is contained in:
@@ -4,7 +4,9 @@ import android.app.Activity;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.BitmapFactory;
|
import android.graphics.BitmapFactory;
|
||||||
|
import android.graphics.Canvas;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
|
import android.graphics.PorterDuff;
|
||||||
import android.graphics.Typeface;
|
import android.graphics.Typeface;
|
||||||
import android.graphics.drawable.GradientDrawable;
|
import android.graphics.drawable.GradientDrawable;
|
||||||
import android.os.Build;
|
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.LocationSource;
|
||||||
import com.amap.api.maps.MapView;
|
import com.amap.api.maps.MapView;
|
||||||
import com.amap.api.maps.MapsInitializer;
|
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.BitmapDescriptorFactory;
|
||||||
import com.amap.api.maps.model.LatLng;
|
import com.amap.api.maps.model.LatLng;
|
||||||
import com.amap.api.maps.model.Marker;
|
import com.amap.api.maps.model.Marker;
|
||||||
@@ -92,8 +95,7 @@ import okhttp3.Response;
|
|||||||
/**
|
/**
|
||||||
* 高德地图导航
|
* 高德地图导航
|
||||||
*/
|
*/
|
||||||
public class NativeMapView implements PlatformView, LocationSource, AMapLocationListener,
|
public class NativeMapView implements PlatformView, LocationSource, AMapLocationListener, GeocodeSearch.OnGeocodeSearchListener, RouteSearch.OnRouteSearchListener, AMap.OnMarkerClickListener, Inputtips.InputtipsListener {
|
||||||
GeocodeSearch.OnGeocodeSearchListener, RouteSearch.OnRouteSearchListener, AMap.OnMarkerClickListener, Inputtips.InputtipsListener {
|
|
||||||
|
|
||||||
private static final String TAG = "NativeMapView";
|
private static final String TAG = "NativeMapView";
|
||||||
private final FrameLayout container;
|
private final FrameLayout container;
|
||||||
@@ -316,8 +318,7 @@ public class NativeMapView implements PlatformView, LocationSource, AMapLocation
|
|||||||
tvStationName.setTextSize(18);
|
tvStationName.setTextSize(18);
|
||||||
tvStationName.setTextColor(Color.BLACK);
|
tvStationName.setTextColor(Color.BLACK);
|
||||||
tvStationName.setTypeface(Typeface.DEFAULT_BOLD);
|
tvStationName.setTypeface(Typeface.DEFAULT_BOLD);
|
||||||
LinearLayout.LayoutParams nameParams = new LinearLayout.LayoutParams(
|
LinearLayout.LayoutParams nameParams = new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT, 1.0f);
|
||||||
0, ViewGroup.LayoutParams.WRAP_CONTENT, 1.0f);
|
|
||||||
titleLayout.addView(tvStationName, nameParams);
|
titleLayout.addView(tvStationName, nameParams);
|
||||||
|
|
||||||
// 关闭按钮 (X)
|
// 关闭按钮 (X)
|
||||||
@@ -398,9 +399,7 @@ public class NativeMapView implements PlatformView, LocationSource, AMapLocation
|
|||||||
// 开始规划前隐藏输入框面板
|
// 开始规划前隐藏输入框面板
|
||||||
searchArea.setVisibility(View.GONE);
|
searchArea.setVisibility(View.GONE);
|
||||||
|
|
||||||
RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(
|
RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(new LatLonPoint(startPoint.latitude, startPoint.longitude), new LatLonPoint(endPoint.latitude, endPoint.longitude));
|
||||||
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.DriveRouteQuery query = new RouteSearch.DriveRouteQuery(fromAndTo, RouteSearch.DRIVING_SINGLE_DEFAULT, null, null, "");
|
||||||
routeSearch.calculateDriveRouteAsyn(query);
|
routeSearch.calculateDriveRouteAsyn(query);
|
||||||
}
|
}
|
||||||
@@ -466,10 +465,7 @@ public class NativeMapView implements PlatformView, LocationSource, AMapLocation
|
|||||||
//防止 parseDouble 崩溃
|
//防止 parseDouble 崩溃
|
||||||
if (latStr != null && !latStr.isEmpty() && lngStr != null && !lngStr.isEmpty()) {
|
if (latStr != null && !latStr.isEmpty() && lngStr != null && !lngStr.isEmpty()) {
|
||||||
try {
|
try {
|
||||||
finalDestinationLatLng = new LatLng(
|
finalDestinationLatLng = new LatLng(Double.parseDouble(latStr), Double.parseDouble(lngStr));
|
||||||
Double.parseDouble(latStr),
|
|
||||||
Double.parseDouble(lngStr)
|
|
||||||
);
|
|
||||||
if (truckRouteData.destinationSite.name != null && !truckRouteData.destinationSite.name.isEmpty()) {
|
if (truckRouteData.destinationSite.name != null && !truckRouteData.destinationSite.name.isEmpty()) {
|
||||||
finalDestinationName = truckRouteData.destinationSite.name;
|
finalDestinationName = truckRouteData.destinationSite.name;
|
||||||
}
|
}
|
||||||
@@ -582,9 +578,7 @@ public class NativeMapView implements PlatformView, LocationSource, AMapLocation
|
|||||||
json.put("plateNumber", plateNumber);
|
json.put("plateNumber", plateNumber);
|
||||||
json.put("hydrogenSiteId", selectedSiteId);
|
json.put("hydrogenSiteId", selectedSiteId);
|
||||||
|
|
||||||
Request.Builder requestBuilder = new Request.Builder()
|
Request.Builder requestBuilder = new Request.Builder().url(mDebugUrl + "truck/truckRouteAlgorithm").post(RequestBody.create(json.toString(), MediaType.parse("application/json")));
|
||||||
.url(mDebugUrl + "truck/truckRouteAlgorithm")
|
|
||||||
.post(RequestBody.create(json.toString(), MediaType.parse("application/json")));
|
|
||||||
|
|
||||||
if (token != null && !token.isEmpty()) {
|
if (token != null && !token.isEmpty()) {
|
||||||
requestBuilder.addHeader("asoco-token", token);
|
requestBuilder.addHeader("asoco-token", token);
|
||||||
@@ -780,8 +774,11 @@ public class NativeMapView implements PlatformView, LocationSource, AMapLocation
|
|||||||
try {
|
try {
|
||||||
JSONObject item = array.getJSONObject(i);
|
JSONObject item = array.getJSONObject(i);
|
||||||
String id = item.getString("id");
|
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) {
|
} 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,
|
private void markStation(LatLng latLng, String name, String address, String stationId, boolean isRecommend) {
|
||||||
boolean isRecommend) {
|
|
||||||
MarkerOptions markerOptions = new MarkerOptions()
|
String displayName = name;
|
||||||
.position(latLng).title(name)
|
if (displayName != null && displayName.length() > 7) {
|
||||||
.icon(BitmapDescriptorFactory.defaultMarker(
|
displayName = displayName.substring(0, 7) + "...";
|
||||||
isRecommend ? BitmapDescriptorFactory.HUE_RED
|
}
|
||||||
: BitmapDescriptorFactory.HUE_GREEN));
|
|
||||||
|
BitmapDescriptor icon = getMarkerIconWithText(mContext, displayName, isRecommend);
|
||||||
|
|
||||||
|
MarkerOptions markerOptions = new MarkerOptions().position(latLng).icon(icon).anchor(0.5f, 0.8f); // 重点:调整锚点,确保图标尖端对准经纬度
|
||||||
|
|
||||||
Marker m = aMap.addMarker(markerOptions);
|
Marker m = aMap.addMarker(markerOptions);
|
||||||
|
|
||||||
Map<String, Object> dataMap = new HashMap<>();
|
Map<String, Object> dataMap = new HashMap<>();
|
||||||
@@ -818,8 +819,14 @@ public class NativeMapView implements PlatformView, LocationSource, AMapLocation
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onMarkerClick(Marker marker) {
|
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) {
|
if (obj instanceof Map) {
|
||||||
Map<String, Object> dataMap = (Map<String, Object>) obj;
|
Map<String, Object> dataMap = (Map<String, Object>) obj;
|
||||||
|
|
||||||
@@ -909,6 +916,61 @@ public class NativeMapView implements PlatformView, LocationSource, AMapLocation
|
|||||||
mapView.onDestroy();
|
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. 成本计算模式 (高亮绿色头部)
|
// 1. 成本计算模式 (高亮绿色头部)
|
||||||
TextView item1 = createMenuItem(context, "成本计算模式", true);
|
TextView item1 = createMenuItem(context, "成本计算模式", false);
|
||||||
item1.setOnClickListener(v -> switchMode("成本计算"));
|
item1.setOnClickListener(v -> switchMode("成本计算"));
|
||||||
|
|
||||||
// 2. 送货规划模式
|
// 2. 送货规划模式
|
||||||
@@ -978,7 +1040,7 @@ public class NativeMapView implements PlatformView, LocationSource, AMapLocation
|
|||||||
item2.setOnClickListener(v -> switchMode("送货规划"));
|
item2.setOnClickListener(v -> switchMode("送货规划"));
|
||||||
|
|
||||||
// 3. 加氢规划模式
|
// 3. 加氢规划模式
|
||||||
TextView item3 = createMenuItem(context, "加氢规划模式", false);
|
TextView item3 = createMenuItem(context, "加氢规划模式", true);
|
||||||
item3.setOnClickListener(v -> switchMode("加氢规划"));
|
item3.setOnClickListener(v -> switchMode("加氢规划"));
|
||||||
|
|
||||||
menu.addView(item1);
|
menu.addView(item1);
|
||||||
|
|||||||
BIN
ln_jq_app/android/app/src/main/res/drawable/ic_marker.png
Normal file
BIN
ln_jq_app/android/app/src/main/res/drawable/ic_marker.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.6 KiB |
BIN
ln_jq_app/android/app/src/main/res/drawable/ic_un_marker.png
Normal file
BIN
ln_jq_app/android/app/src/main/res/drawable/ic_un_marker.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.8 KiB |
Reference in New Issue
Block a user