From b275c663837f533a58b5f537280cffca213f67b6 Mon Sep 17 00:00:00 2001 From: userGyl Date: Thu, 26 Mar 2026 16:58:57 +0800 Subject: [PATCH] ui --- .../com/lnkj/ln_jq_app/NativeMapView.java | 257 ++++++++++++++++-- .../app/src/main/res/drawable/ic_close.png | Bin 0 -> 880 bytes .../app/src/main/res/drawable/ic_fuel.png | Bin 0 -> 1150 bytes .../app/src/main/res/drawable/ic_location.png | Bin 0 -> 3173 bytes .../app/src/main/res/drawable/ic_mileage.png | Bin 0 -> 1102 bytes .../app/src/main/res/drawable/ic_time.png | Bin 0 -> 810 bytes .../app/src/main/res/drawable/ic_toll.png | Bin 0 -> 924 bytes 7 files changed, 240 insertions(+), 17 deletions(-) create mode 100644 ln_jq_app/android/app/src/main/res/drawable/ic_close.png create mode 100644 ln_jq_app/android/app/src/main/res/drawable/ic_fuel.png create mode 100644 ln_jq_app/android/app/src/main/res/drawable/ic_location.png create mode 100644 ln_jq_app/android/app/src/main/res/drawable/ic_mileage.png create mode 100644 ln_jq_app/android/app/src/main/res/drawable/ic_time.png create mode 100644 ln_jq_app/android/app/src/main/res/drawable/ic_toll.png 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 c7df795..d3dfc36 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 @@ -7,6 +7,7 @@ import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.Typeface; import android.graphics.drawable.GradientDrawable; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -23,6 +24,7 @@ import android.widget.Button; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.ImageButton; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; @@ -110,7 +112,11 @@ public class NativeMapView implements PlatformView, LocationSource, AMapLocation private EditText endInput; private LinearLayout searchArea; // 规划路线面板 private LinearLayout detailPanel; // 详情面板 - private TextView tvStationName, tvStationAddr, tvRouteInfo; + + private View modeMenu; //模式选择 + private TextView tvStationName, tvStationAddr, planToggleBtn; + //时间 费用 里程 路费 + private TextView tvDuration, tvDistance, tvTolls, tvTollsFuel; private LatLng currentLatLng; private String startName = "我的位置"; @@ -239,17 +245,57 @@ public class NativeMapView implements PlatformView, LocationSource, AMapLocation bottomParams.setMargins(dp2px(12), 0, dp2px(12), dp2px(65)); container.addView(bottomContainer, bottomParams); + + // --- 模式选择菜单 --- + modeMenu = createModeMenu(context); + modeMenu.setVisibility(View.GONE); + // 布局参数:位于规划按钮上方 + FrameLayout.LayoutParams menuParams = new FrameLayout.LayoutParams(dp2px(130), ViewGroup.LayoutParams.WRAP_CONTENT); + menuParams.gravity = Gravity.BOTTOM | Gravity.END; + menuParams.setMargins(0, 0, dp2px(15), dp2px(330)); // 高度根据按钮位置调整 + container.addView(modeMenu, menuParams); + + // 加氢规划圆形按钮 + planToggleBtn = new TextView(context); + planToggleBtn.setText("加氢\n规划"); + planToggleBtn.setTextSize(11); + planToggleBtn.setTextColor(Color.WHITE); + planToggleBtn.setGravity(Gravity.CENTER); + planToggleBtn.setTypeface(Typeface.DEFAULT_BOLD); + // 设置深绿色圆形背景 + planToggleBtn.setBackground(getCircleDrawable(Color.parseColor("#017143"))); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + planToggleBtn.setElevation(dp2px(6)); + } + planToggleBtn.setOnClickListener(v -> { + // 切换菜单显示/隐藏 + modeMenu.setVisibility(modeMenu.getVisibility() == View.VISIBLE ? View.GONE : View.VISIBLE); + }); + + int layoutSize = dp2px(44); + FrameLayout.LayoutParams toggleParams = new FrameLayout.LayoutParams(layoutSize, layoutSize); + toggleParams.gravity = Gravity.BOTTOM | Gravity.END; + toggleParams.setMargins(0, 0, dp2px(12), dp2px(340)); // 位于定位按钮上方 + container.addView(planToggleBtn, toggleParams); + // --- 右下角定位按钮 --- ImageButton locBtn = new ImageButton(context); - locBtn.setImageResource(android.R.drawable.ic_menu_mylocation); - locBtn.setBackground(getRoundedDrawable(Color.WHITE, 25)); - locBtn.setElevation(dp2px(4)); + locBtn.setImageResource(R.drawable.ic_location); + // 设置自定义的白色圆形背景 + locBtn.setBackgroundColor(Color.TRANSPARENT); + // 设置投影(仅在 API 21+ 有效,能产生干净的阴影而非黑块) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + locBtn.setElevation(dp2px(4)); + } + locBtn.setScaleType(ImageView.ScaleType.FIT_CENTER); + int padding = dp2px(2); + locBtn.setPadding(padding, padding, padding, padding); locBtn.setOnClickListener(v -> { if (currentLatLng != null) aMap.animateCamera(CameraUpdateFactory.newLatLngZoom(currentLatLng, 15f)); }); - FrameLayout.LayoutParams locParams = new FrameLayout.LayoutParams(dp2px(44), dp2px(44)); - locParams.setMargins(0, 0, dp2px(15), dp2px(250)); // 调高一点,避开底部的面板 + FrameLayout.LayoutParams locParams = new FrameLayout.LayoutParams(layoutSize, layoutSize); + locParams.setMargins(0, 0, dp2px(15), dp2px(285)); // 调高一点,避开底部的面板 locParams.gravity = Gravity.BOTTOM | Gravity.END; container.addView(locBtn, locParams); } @@ -259,24 +305,71 @@ public class NativeMapView implements PlatformView, LocationSource, AMapLocation panel.setOrientation(LinearLayout.VERTICAL); panel.setBackground(getRoundedDrawable(Color.WHITE, 16)); panel.setPadding(dp2px(20), dp2px(20), dp2px(20), dp2px(20)); - panel.setElevation(dp2px(12)); + // --- (包含标题和关闭按钮) --- + LinearLayout titleLayout = new LinearLayout(context); + titleLayout.setOrientation(LinearLayout.HORIZONTAL); + titleLayout.setGravity(Gravity.CENTER_VERTICAL); + + // 站点名称 (设置 weight: 1 占据剩余空间) tvStationName = new TextView(context); tvStationName.setTextSize(18); tvStationName.setTextColor(Color.BLACK); tvStationName.setTypeface(Typeface.DEFAULT_BOLD); - panel.addView(tvStationName); + LinearLayout.LayoutParams nameParams = new LinearLayout.LayoutParams( + 0, ViewGroup.LayoutParams.WRAP_CONTENT, 1.0f); + titleLayout.addView(tvStationName, nameParams); + + // 关闭按钮 (X) + ImageView ivClose = new ImageView(context); + ivClose.setImageResource(R.drawable.ic_close); + ivClose.setScaleType(ImageView.ScaleType.CENTER_INSIDE); + ivClose.setPadding(dp2px(5), dp2px(5), dp2px(5), dp2px(5)); + ivClose.setOnClickListener(v -> { + if (detailPanel != null) + detailPanel.setVisibility(View.GONE); + searchArea.setVisibility(View.VISIBLE); + planToggleBtn.setVisibility(View.VISIBLE); + }); + + LinearLayout.LayoutParams closeParams = new LinearLayout.LayoutParams(dp2px(28), dp2px(28)); + titleLayout.addView(ivClose, closeParams); + + panel.addView(titleLayout); tvStationAddr = new TextView(context); tvStationAddr.setTextSize(13); - tvStationAddr.setPadding(0, dp2px(4), 0, dp2px(10)); + tvStationAddr.setPadding(0, dp2px(4), 0, 0); tvStationAddr.setTextColor(Color.GRAY); panel.addView(tvStationAddr); - tvRouteInfo = new TextView(context); - tvRouteInfo.setTextSize(14); - tvRouteInfo.setTextColor(Color.parseColor("#333333")); - panel.addView(tvRouteInfo); + /*内容*/ + LinearLayout routeInfoLayout = new LinearLayout(context); + routeInfoLayout.setOrientation(LinearLayout.VERTICAL); + routeInfoLayout.setPadding(0, dp2px(5), 0, 0); + + // 第一行:预计时间 + LinearLayout row1 = new LinearLayout(context); + row1.setOrientation(LinearLayout.HORIZONTAL); + row1.setGravity(Gravity.CENTER_VERTICAL); + row1.setPadding(0, dp2px(8), 0, 0); // 增加行间距 + tvDuration = createInfoItem(row1, R.drawable.ic_time, "预计时间:", "", 1.0f); + tvTollsFuel = createInfoItem(row1, R.drawable.ic_fuel, "加氢费用:", "", 1.0f); + routeInfoLayout.addView(row1); + + // 第二行:里程 + 过路费 + LinearLayout row2 = new LinearLayout(context); + row2.setOrientation(LinearLayout.HORIZONTAL); + row2.setGravity(Gravity.CENTER_VERTICAL); + row2.setPadding(0, dp2px(10), 0, 0); // 增加行间距 + + // 里程 + tvDistance = createInfoItem(row2, R.drawable.ic_mileage, "行驶里程:", "", 1.0f); + // 过路费 + tvTolls = createInfoItem(row2, R.drawable.ic_toll, "过路费:", "", 1.0f); + + routeInfoLayout.addView(row2); + panel.addView(routeInfoLayout); Button startNaviBtn = new Button(context); startNaviBtn.setText("开始导航"); @@ -328,14 +421,24 @@ public class NativeMapView implements PlatformView, LocationSource, AMapLocation if (rCode == AMapException.CODE_AMAP_SUCCESS && result != null && !result.getPaths().isEmpty()) { DrivePath path = result.getPaths().get(0); - // 规划成功,显示详情面板 + // 规划成功,显示详情面板,隐藏模式选择 detailPanel.setVisibility(View.VISIBLE); + planToggleBtn.setVisibility(View.GONE); + modeMenu.setVisibility(View.GONE); + tvStationName.setText(endName); tvStationAddr.setText(endAddress); - String info = String.format("预计时间:%d分钟 | 行驶里程:%.1f公里 | 预计路费:%.0f元", - path.getDuration() / 60, path.getDistance() / 1000f, path.getTolls()); - tvRouteInfo.setText(info); + + double distanceKm = path.getDistance() / 1000f; + long durationMin = path.getDuration() / 60; + double tolls = path.getTolls(); + String hydrogenCost = truckRouteData.algorithmPath.hydrogenCost; + + tvDuration.setText("预计时间:" + durationMin + "分钟"); + tvDistance.setText("行驶里程:" + String.format("%.1f", distanceKm) + "公里"); + tvTolls.setText("过路费:" + (int) tolls + "元"); + tvTollsFuel.setText("加氢费用:" + hydrogenCost + "元"); aMap.animateCamera(CameraUpdateFactory.newLatLngZoom(endPoint, 13f)); } else { @@ -806,6 +909,126 @@ public class NativeMapView implements PlatformView, LocationSource, AMapLocation mapView.onDestroy(); } + + /** + * 辅助方法:创建带图标的文本项 + */ + private TextView createInfoItem(LinearLayout parent, int iconRes, String label, String value, float weight) { + LinearLayout itemContainer = new LinearLayout(mContext); + itemContainer.setOrientation(LinearLayout.HORIZONTAL); + itemContainer.setGravity(Gravity.CENTER_VERTICAL); + + // 图标 + ImageView iv = new ImageView(mContext); + iv.setImageResource(iconRes); + iv.setScaleType(ImageView.ScaleType.CENTER_INSIDE); + iv.setColorFilter(Color.parseColor("#017143")); // 统一设为主题绿 + itemContainer.addView(iv, new LinearLayout.LayoutParams(dp2px(18), dp2px(18))); + + // 文本内容 + TextView tv = new TextView(mContext); + tv.setText(label + value); + tv.setTextSize(14); + tv.setTextColor(Color.parseColor("#333333")); + tv.setPadding(dp2px(6), 0, 0, 0); + + LinearLayout.LayoutParams tvParams = new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT, 1.0f); + itemContainer.addView(tv, tvParams); + + // 将整个项加入父容器 + LinearLayout.LayoutParams containerParams = new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT, weight); + parent.addView(itemContainer, containerParams); + + return tv; // 返回TextView以便后续更新内容 + } + + // 过载一个不需要weight的方法给第一行使用 + private TextView createInfoItem(LinearLayout parent, int iconRes, String label, String value) { + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + + ImageView iv = new ImageView(mContext); + iv.setImageResource(iconRes); + iv.setColorFilter(Color.parseColor("#017143")); + parent.addView(iv, new LinearLayout.LayoutParams(dp2px(18), dp2px(18))); + + TextView tv = new TextView(mContext); + tv.setTextSize(14); + tv.setTextColor(Color.parseColor("#333333")); + tv.setPadding(dp2px(6), 0, 0, 0); + parent.addView(tv, params); + + return tv; + } + + // 创建模式菜单视图 + private View createModeMenu(Context context) { + LinearLayout menu = new LinearLayout(context); + menu.setOrientation(LinearLayout.VERTICAL); + menu.setBackground(getRoundedDrawable(Color.WHITE, 12)); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + menu.setElevation(dp2px(10)); + } + + // 1. 成本计算模式 (高亮绿色头部) + TextView item1 = createMenuItem(context, "成本计算模式", true); + item1.setOnClickListener(v -> switchMode("成本计算")); + + // 2. 送货规划模式 + TextView item2 = createMenuItem(context, "送货规划模式", false); + item2.setOnClickListener(v -> switchMode("送货规划")); + + // 3. 加氢规划模式 + TextView item3 = createMenuItem(context, "加氢规划模式", false); + item3.setOnClickListener(v -> switchMode("加氢规划")); + + menu.addView(item1); + menu.addView(item2); + menu.addView(item3); + return menu; + } + + private TextView createMenuItem(Context context, String text, boolean isHighlight) { + TextView tv = new TextView(context); + tv.setText(text); + tv.setTextSize(13); + tv.setPadding(dp2px(15), dp2px(12), dp2px(15), dp2px(12)); + tv.setGravity(Gravity.CENTER); + if (isHighlight) { + tv.setTextColor(Color.WHITE); + // 顶部圆角绿色背景 + tv.setBackground(getTopRoundedDrawable(Color.parseColor("#27AE60"), 12)); + } else { + tv.setTextColor(Color.parseColor("#666666")); + tv.setBackgroundColor(Color.TRANSPARENT); + } + return tv; + } + + private void switchMode(String mode) { + // 处理模式切换逻辑 + Toast.makeText(mContext, "切换到:" + mode, Toast.LENGTH_SHORT).show(); + modeMenu.setVisibility(View.GONE); + } + + // 获取纯圆形背景 + private GradientDrawable getCircleDrawable(int color) { + GradientDrawable gd = new GradientDrawable(); + gd.setColor(color); + gd.setShape(GradientDrawable.OVAL); + return gd; + } + + // 获取顶部带圆角,底部直角的背景(用于菜单第一项) + private GradientDrawable getTopRoundedDrawable(int color, int radiusDp) { + float r = dp2px(radiusDp); + GradientDrawable gd = new GradientDrawable(); + gd.setColor(color); + // 顺序:左上x2, 右上x2, 右下x2, 左下x2 + gd.setCornerRadii(new float[]{r, r, r, r, 0, 0, 0, 0}); + return gd; + } + + /** * 解析接口返回的data数据 */ diff --git a/ln_jq_app/android/app/src/main/res/drawable/ic_close.png b/ln_jq_app/android/app/src/main/res/drawable/ic_close.png new file mode 100644 index 0000000000000000000000000000000000000000..b934db94424a3ac3bea0a3ec387ccc1a259d718a GIT binary patch literal 880 zcmV-$1CRWPP)`V|&n2;%-kDI2Vcu;OP#4##rx>+9kFmH-cb0AK3`tQYWb1=d&K z;SXT_5?o(_^%Z!y0_!XA@CUH|3S@o-{=8ljdmTf6%wU&>)R(dZKML=fV)%px$YS}O4m%7&$#)_~|xM0Avxj0Ka7xXRVr? zyL#}4*k}Qewtz+WXUrXU&)hkUogn~H7O@cjh{3vZ1lxs~B><8ZvKW8MU|_c}hiiMl znF8!_`Ih=j0eq@kzwn9xFt8;add?ESLKZu^46Hjx@t1Kk1h9yO&XRP;-Lv;j;YSN# z0gFVW{K8{V-CaGRdUt-L0Ek;4B583L#*c7%z(n<~{3rnsMm!>CVVF|q%ayo3^@6GM z-SG$k5Jfm5XHl5CE~i%KOROhMiBryO0T4tqB4ZkLW0w9K9M8aY) zQN840U`t$|X28_>OL3L}2q6}cunWA{Z0w91$G|U1pQGGA(t{xH2Y?!FNo9`81YXIV15dG@~y0n9`MA;y;*VS1av_}w$I z1V98K#vf^Bu#_2@0;CX{-DC+cTk*TiTQA^lpU7-J>jlhK{BHBs3%J`SGMmqO0kajq z+r0Gx?)Hhy=JVrUK(Ao`00030{}%D5PXGV_21!IgR09Az7;=FG%TB}q0000YiXTK2ElwZ$%jGOmzqlVH;*QVz3<&;owfJ6XWw(L z!A6Hd(3&XqzR?`=HYVVTr|WhK^nHOHL|ffMXl@RezpiaeAeDGfEC!+41jQ4K-@{$M z)~s8dgc}REr)*8s@~J;2w~9>~@eWjajBD%dWNiUusfx>wis%UdrSxId_%qI3OfU6o z;NRg!u!$x)o;#yOw6r$4!KxktS<1{&JqLL1IT>&3-B_4zZBXHV?&dydmZW8Dq;moKT_qfxJ)YK5Wxu%?8W5u z1mlQB1zHou#-f>wGEw;g`E6&76eU&AEukDivZma*gmXt6h8)_EzwI=+pE0MxK=v$e zmEppFrdr9w-2|p=kUN0G=jLoqk3l3$tid37)47YG%Kqb&=Qu7fr9cC$xrggZ78QUt zvY%xn9>rT1e(cjcRPZx(dR8(A_DAV1Mv_l zXLtwNYHpWQ-A4lR35!+(LOxxjT8K$&{WvXG0xE^>3Mp{LesqG6lxI8Zek3dBN!La$S-7>fR>XyPWBw{z`^YAOzfk`fCx@5 z6rL8VCme>*cCkHwdM?5_D3}ZP)fXUMmkHn>wqgt7LBKVjwWdr0dz8hUNSXz1A-+{b zQVx^A97nRgk{GZ_-A-?1>~_mr!J+~x-$7(M!ufj(%Ox{>c^^VB3?KtwcEK|aV~d6e zO%Ma-gB`@~fcg{XA$N%gu-Hk0F@Z_Ljs6UiO^4dK78W}|=x^sPb{G(Jp#LH{0C)Nd z6q~tr3jZ4s0mN|{qHY(BNYI;}{wWIbX7w(dq=v|>TdSbea+=e?v|Kbl$&Dn-WjXv03g+D=}(NC(Em*j zcR7P)W2L|%VPN!(#_VG%@~S8X31yO^V{4MC!BglPJ&QHQ+5#@&Q1&W%M~>O+ z`F)y?Kc_`SP2L$h485c8@~MA>aIcQPivJ4$0RR7`A0%x6000I_L_t&o0Pw@jn$2T| Qi2wiq07*qoM6N<$g8!`@umAu6 literal 0 HcmV?d00001 diff --git a/ln_jq_app/android/app/src/main/res/drawable/ic_location.png b/ln_jq_app/android/app/src/main/res/drawable/ic_location.png new file mode 100644 index 0000000000000000000000000000000000000000..fa96dc0b1ac8042f49eff9b1d3152728accf1aa8 GIT binary patch literal 3173 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 U%wYT}A^-pY07*qoM6N<$f_Q`noB#j- literal 0 HcmV?d00001 diff --git a/ln_jq_app/android/app/src/main/res/drawable/ic_time.png b/ln_jq_app/android/app/src/main/res/drawable/ic_time.png new file mode 100644 index 0000000000000000000000000000000000000000..38bc14ba2006770faf9f09df22caf31f46022879 GIT binary patch literal 810 zcmV+_1J(SAP)Qv{4*zHevd%sJYS5h3%FQUgRm3XYlWDLmYa08fc$yIVB{G?M$RDu&}#sL z0DcQoAs=p(K$22`#eY z29~$4Y~m0C@4A=P+zEI3^a75@-O*`uj=V&0xECG6UFaAIA{gpLAoR*PijHfl{vQAU o0RR8XgYZoN000I_L_t&o0IIY8F^EkbPXGV_07*qoM6N<$f{6od)c^nh literal 0 HcmV?d00001 diff --git a/ln_jq_app/android/app/src/main/res/drawable/ic_toll.png b/ln_jq_app/android/app/src/main/res/drawable/ic_toll.png new file mode 100644 index 0000000000000000000000000000000000000000..4ae32e3857d1f63fc7178e2dc6a8a8d069d1f27f GIT binary patch literal 924 zcmV;N17rM&P)+H49K94Jy z=uog&iir{Yyr9}^jW0rC-mEB+2@%MoCv8r#j?~>~Yj~v)iQt#{)1)Q7gNeG+Y>6KW zVR~Q>{9`6IHhTDRZl#m{W$Hbip*5)nw4b;)Ce923FH@z!`v3=&=okV-kh7Z~`6EdF z+VxMR+FK>AVh#LBzajnZi}@k>a@ZpE@HbYZRt`a-|K|sW^7I>3aD2--4p@77K|O`q z+P=^~N(c$y-0cxQ;=u?#P+I4{43AR*b^!iANTw1Xtt9=7u#eT zdf3n@^u7vxMTGGa#QN{6i!D*Og(~u;^PX%ik~egfCQ!c|&2^3N%NxO`^~j{d5J8uPnIvOlD%j-%#fZD2y;5_>JySmJR+S5Yn?DW$-hq>&s4RPj&aDM>Dl^%3CgS@dk?!0}x;X^? zL`(el5-SL52;jZ}(Ew!^gfmV4q6mU_?W)b1YvKW|KV`t8)pW{^*^zxNR!3)$UGO?7P}j3Lq3WUp?gdGR>&@r1(Wkp1c+0 yLuN`lHg@+u0{{U3|6z&ZwEzGB21!IgR09BDjiV8ZGuvhW0000