diff --git a/app/src/main/java/com/ouxuan/oxface/network/NetworkStatusIndicator.java b/app/src/main/java/com/ouxuan/oxface/network/NetworkStatusIndicator.java index 20d8d15..29a89bb 100644 --- a/app/src/main/java/com/ouxuan/oxface/network/NetworkStatusIndicator.java +++ b/app/src/main/java/com/ouxuan/oxface/network/NetworkStatusIndicator.java @@ -2,7 +2,6 @@ package com.ouxuan.oxface.network; import android.content.Context; import android.graphics.Color; -import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; import android.os.Handler; import android.os.Looper; @@ -10,7 +9,6 @@ import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; -import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.PopupWindow; import android.widget.RelativeLayout; @@ -36,20 +34,20 @@ public class NetworkStatusIndicator { private static final int CHECK_INTERVAL = 10; // 检测间隔(秒) private Context context; - private ImageView networkIconView; + private TextView networkTextView; // 改为TextView private RelativeLayout parentLayout; private ScheduledExecutorService scheduledExecutor; private Handler mainHandler; // 网络状态 - private NetworkStatus currentNetworkStatus = NetworkStatus.UNKNOWN; + private NetworkStatus currentNetworkStatus = NetworkStatus.POOR; // 默认为异常状态 private boolean isMonitoring = false; // 网络状态枚举 public enum NetworkStatus { - EXCELLENT(Color.parseColor("#00FF00"), "网络优秀"), // 绿色满格 - GOOD(Color.parseColor("#FFFF00"), "网络良好"), // 黄色中等 - POOR(Color.parseColor("#FF0000"), "网络异常"); // 红色X + EXCELLENT(Color.parseColor("#00FF00"), "网络优秀"), // 绿色 + GOOD(Color.parseColor("#FFFF00"), "网络良好"), // 黄色 + POOR(Color.parseColor("#FF0000"), "网络异常"); // 红色 private final int color; private final String description; @@ -67,7 +65,21 @@ public class NetworkStatusIndicator { return description; } - private static NetworkStatus UNKNOWN = POOR; // 默认为异常状态 + // 网络状态信息类 + private static class NetworkStatusInfo { + NetworkStatus status; + String displayText; + + NetworkStatusInfo(NetworkStatus status, String displayText) { + this.status = status; + this.displayText = displayText; + } + } + + private String lastDisplayText = ""; + + private String getLastDisplayText() { + return lastDisplayText; } public NetworkStatusIndicator(Context context, RelativeLayout parentLayout) { @@ -75,32 +87,45 @@ public class NetworkStatusIndicator { this.parentLayout = parentLayout; this.mainHandler = new Handler(Looper.getMainLooper()); - initNetworkIcon(); + initNetworkTextView(); // 改为初始化TextView initExecutor(); LogManager.logInfo(TAG, "网络状态指示器初始化完成"); } /** - * 初始化网络图标 + * 初始化网络文字显示 */ - private void initNetworkIcon() { - networkIconView = new ImageView(context); + private void initNetworkTextView() { + networkTextView = new TextView(context); - // 设置图标大小为24dp - int iconSize = SizeUtils.dp2px(24); - RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(iconSize, iconSize); + // 设置大小和位置 + RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT); // 定位到右上角 params.addRule(RelativeLayout.ALIGN_PARENT_TOP); params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); params.setMargins(0, SizeUtils.dp2px(16), SizeUtils.dp2px(16), 0); - networkIconView.setLayoutParams(params); - networkIconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); + networkTextView.setLayoutParams(params); + + // 设置文字样式 + networkTextView.setTextSize(10); // 10sp字体大小 + networkTextView.setTextColor(Color.WHITE); + networkTextView.setPadding(SizeUtils.dp2px(6), SizeUtils.dp2px(4), SizeUtils.dp2px(6), SizeUtils.dp2px(4)); + + // 设置背景 + GradientDrawable background = new GradientDrawable(); + background.setShape(GradientDrawable.RECTANGLE); + background.setColor(Color.parseColor("#80000000")); // 半透明黑色背景 + background.setCornerRadius(SizeUtils.dp2px(4)); + background.setStroke(SizeUtils.dp2px(1), Color.parseColor("#40FFFFFF")); // 半透明白色边框 + networkTextView.setBackground(background); // 设置点击事件 - networkIconView.setOnClickListener(new View.OnClickListener() { + networkTextView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showNetworkDetailPopup(); @@ -108,12 +133,12 @@ public class NetworkStatusIndicator { }); // 添加到父布局 - parentLayout.addView(networkIconView); + parentLayout.addView(networkTextView); // 初始显示为异常状态 - updateNetworkIcon(NetworkStatus.POOR); + updateNetworkDisplay(NetworkStatus.POOR, "无网络"); - LogManager.logInfo(TAG, "网络图标视图初始化完成"); + LogManager.logInfo(TAG, "网络文字显示初始化完成"); } /** @@ -180,75 +205,106 @@ public class NetworkStatusIndicator { * 检查网络状态 */ private void checkNetworkStatus() { - NetworkStatus newStatus = evaluateNetworkStatus(); + NetworkStatusInfo statusInfo = evaluateNetworkStatus(); - if (newStatus != currentNetworkStatus) { + if (!statusInfo.status.equals(currentNetworkStatus) || + !statusInfo.displayText.equals(getLastDisplayText())) { NetworkStatus oldStatus = currentNetworkStatus; - currentNetworkStatus = newStatus; + currentNetworkStatus = statusInfo.status; // 在主线程中更新UI + final String displayText = statusInfo.displayText; mainHandler.post(new Runnable() { @Override public void run() { - updateNetworkIcon(currentNetworkStatus); + updateNetworkDisplay(currentNetworkStatus, displayText); // 如果网络从异常恢复到正常,显示Toast提示 if (oldStatus == NetworkStatus.POOR && - (newStatus == NetworkStatus.EXCELLENT || newStatus == NetworkStatus.GOOD)) { + (currentNetworkStatus == NetworkStatus.EXCELLENT || currentNetworkStatus == NetworkStatus.GOOD)) { Toast.makeText(context, "网络连接已恢复", Toast.LENGTH_SHORT).show(); - LogManager.logInfo(TAG, "网络连接已恢复:" + newStatus.getDescription()); + LogManager.logInfo(TAG, "网络连接已恢复:" + currentNetworkStatus.getDescription()); } // 如果网络变为异常,也显示提示 - else if (newStatus == NetworkStatus.POOR && oldStatus != NetworkStatus.POOR) { + else if (currentNetworkStatus == NetworkStatus.POOR && oldStatus != NetworkStatus.POOR) { Toast.makeText(context, "网络连接异常", Toast.LENGTH_SHORT).show(); LogManager.logWarning(TAG, "网络连接异常"); } } }); - LogManager.logDebug(TAG, "网络状态变化:" + oldStatus.getDescription() + " -> " + newStatus.getDescription()); + LogManager.logDebug(TAG, "网络状态变化:" + oldStatus.getDescription() + " -> " + currentNetworkStatus.getDescription() + " (" + displayText + ")"); } } /** * 评估网络状态 */ - private NetworkStatus evaluateNetworkStatus() { + private NetworkStatusInfo evaluateNetworkStatus() { try { // 1. 检查基本连接状态 if (!NetworkUtils.isConnected()) { LogManager.logDebug(TAG, "网络未连接"); - return NetworkStatus.POOR; + return new NetworkStatusInfo(NetworkStatus.POOR, "无网络"); } // 2. 检查连接类型 NetworkUtils.NetworkType networkType = NetworkUtils.getNetworkType(); boolean isWifi = NetworkUtils.isWifiConnected(); + String networkTypeText = getNetworkTypeDisplayText(networkType, isWifi); + // 3. 检查主域名可达性 boolean isDomainReachable = checkDomainReachability(); if (!isDomainReachable) { LogManager.logDebug(TAG, "主域名不可达"); - return NetworkStatus.POOR; + return new NetworkStatusInfo(NetworkStatus.POOR, networkTypeText + "!"); } // 4. 根据网络类型和可达性判断质量 if (isWifi || networkType == NetworkUtils.NetworkType.NETWORK_ETHERNET) { LogManager.logDebug(TAG, "网络状态优秀:WiFi/以太网且域名可达"); - return NetworkStatus.EXCELLENT; + return new NetworkStatusInfo(NetworkStatus.EXCELLENT, networkTypeText); } else if (networkType == NetworkUtils.NetworkType.NETWORK_4G || networkType == NetworkUtils.NetworkType.NETWORK_5G) { LogManager.logDebug(TAG, "网络状态良好:4G/5G且域名可达"); - return NetworkStatus.GOOD; + return new NetworkStatusInfo(NetworkStatus.GOOD, networkTypeText); } else { LogManager.logDebug(TAG, "网络状态一般:其他网络类型"); - return NetworkStatus.GOOD; + return new NetworkStatusInfo(NetworkStatus.GOOD, networkTypeText); } } catch (Exception e) { LogManager.logError(TAG, "网络状态评估失败", e); - return NetworkStatus.POOR; + return new NetworkStatusInfo(NetworkStatus.POOR, "错误"); + } + } + + /** + * 获取网络类型显示文字 + */ + private String getNetworkTypeDisplayText(NetworkUtils.NetworkType networkType, boolean isWifi) { + if (isWifi) { + return "WiFi"; + } + + switch (networkType) { + case NETWORK_ETHERNET: + return "以太网"; + case NETWORK_5G: + return "5G"; + case NETWORK_4G: + return "4G"; + case NETWORK_3G: + return "3G"; + case NETWORK_2G: + return "2G"; + case NETWORK_WIFI: + return "WiFi"; + case NETWORK_UNKNOWN: + default: + return "未知"; } } @@ -290,50 +346,23 @@ public class NetworkStatusIndicator { } /** - * 更新网络图标 + * 更新网络显示 */ - private void updateNetworkIcon(NetworkStatus status) { - Drawable icon = createNetworkIcon(status); - networkIconView.setImageDrawable(icon); + private void updateNetworkDisplay(NetworkStatus status, String displayText) { + // 更新文字内容 + networkTextView.setText(displayText); - LogManager.logDebug(TAG, "网络图标已更新:" + status.getDescription()); - } - - /** - * 创建网络图标 - */ - private Drawable createNetworkIcon(NetworkStatus status) { - GradientDrawable drawable = new GradientDrawable(); - - switch (status) { - case EXCELLENT: - // 绿色信号满格图标(矩形) - drawable.setShape(GradientDrawable.RECTANGLE); - drawable.setColor(status.getColor()); - drawable.setCornerRadius(SizeUtils.dp2px(3)); - drawable.setSize(SizeUtils.dp2px(24), SizeUtils.dp2px(18)); - break; - - case GOOD: - // 黄色中等信号图标(矩形,稍小) - drawable.setShape(GradientDrawable.RECTANGLE); - drawable.setColor(status.getColor()); - drawable.setCornerRadius(SizeUtils.dp2px(3)); - drawable.setSize(SizeUtils.dp2px(24), SizeUtils.dp2px(15)); - break; - - case POOR: - default: - // 红色X图标(圆形) - drawable.setShape(GradientDrawable.OVAL); - drawable.setColor(status.getColor()); - drawable.setSize(SizeUtils.dp2px(24), SizeUtils.dp2px(24)); - break; - } + // 更新文字颜色 + networkTextView.setTextColor(status.getColor()); + + // 保存显示文字 + lastDisplayText = displayText; - return drawable; + LogManager.logDebug(TAG, "网络显示已更新:" + status.getDescription() + " (" + displayText + ")"); } + + /** * 显示网络详细信息弹窗 */ @@ -363,8 +392,8 @@ public class NetworkStatusIndicator { popup.setFocusable(true); popup.setOutsideTouchable(true); - // 显示在图标下方 - popup.showAsDropDown(networkIconView, -SizeUtils.dp2px(150), SizeUtils.dp2px(5)); + // 显示在文字下方 + popup.showAsDropDown(networkTextView, -SizeUtils.dp2px(150), SizeUtils.dp2px(5)); // 3秒后自动关闭 mainHandler.postDelayed(new Runnable() { @@ -473,9 +502,9 @@ public class NetworkStatusIndicator { public void destroy() { stopMonitoring(); - if (networkIconView != null && parentLayout != null) { - parentLayout.removeView(networkIconView); - networkIconView = null; + if (networkTextView != null && parentLayout != null) { + parentLayout.removeView(networkTextView); + networkTextView = null; } LogManager.logInfo(TAG, "网络状态指示器已销毁"); diff --git a/网络状态指示器文字显示更新说明.md b/网络状态指示器文字显示更新说明.md new file mode 100644 index 0000000..fd00eec --- /dev/null +++ b/网络状态指示器文字显示更新说明.md @@ -0,0 +1,95 @@ +# 网络状态指示器文字显示更新 + +## 🎯 更新内容 + +根据您的需求,将原来粗糙的图标显示改为更直观的文字显示,现在网络状态指示器会在右上角显示实际的网络类型文字。 + +## ✨ 新的显示效果 + +### 1. 文字显示内容 +- **WiFi** - WiFi连接 +- **以太网** - 有线网络连接 +- **5G** - 5G移动网络 +- **4G** - 4G移动网络 +- **3G** - 3G移动网络 +- **2G** - 2G移动网络 +- **未知** - 无法识别的网络类型 +- **无网络** - 没有网络连接 +- **错误** - 检测过程出错 + +### 2. 文字颜色含义 +- 🟢 **绿色文字** - 网络状态优秀(WiFi/以太网且主域名可达) +- 🟡 **黄色文字** - 网络状态良好(4G/5G且主域名可达) +- 🔴 **红色文字** - 网络状态异常(无连接或主域名不可达) + +### 3. 异常状态标识 +当网络连接正常但主域名不可达时,会在文字后添加感叹号,如: +- **WiFi!** - WiFi已连接但无法访问服务器 +- **4G!** - 4G已连接但无法访问服务器 + +## 🎨 视觉设计 + +### 文字样式 +- **字体大小**: 10sp,确保清晰可读又不会过大 +- **颜色**: 根据网络状态动态变化(绿/黄/红) +- **背景**: 半透明黑色圆角矩形 (#80000000) +- **边框**: 半透明白色细边框 (#40FFFFFF) +- **内边距**: 6dp左右,4dp上下 + +### 位置布局 +- **位置**: 屏幕右上角 +- **边距**: 距离右边缘16dp,距离顶部16dp +- **大小**: 自适应文字内容 + +## 🔧 技术改进 + +### 1. 代码重构 +- 将 `ImageView` 改为 `TextView` +- 移除图标绘制相关代码 +- 添加文字内容和颜色动态更新逻辑 +- 优化网络类型识别和显示逻辑 + +### 2. 显示逻辑优化 +- 实时显示具体网络类型 +- 区分连接状态和服务器可达性 +- 提供更精确的网络状态反馈 + +### 3. 交互体验 +- 保持原有的点击查看详情功能 +- Toast提示保持不变 +- 详细信息弹窗位置相应调整 + +## 📱 用户体验提升 + +### 直观性 +- 用户一眼就能看出当前使用的网络类型 +- 无需记忆图标含义,文字更直观 +- 颜色辅助快速判断网络质量 + +### 信息丰富度 +- 显示具体网络技术类型(WiFi、4G、5G等) +- 异常状态有明确标识 +- 结合颜色提供更多信息层次 + +### 一致性 +- 与系统状态栏的网络显示逻辑保持一致 +- 文字显示符合用户习惯 +- 保持原有的交互方式 + +## 🚀 功能保持 + +所有原有功能均保持不变: +- ✅ 每10秒自动检测网络状态 +- ✅ 点击显示详细网络信息 +- ✅ 网络状态变化时的Toast提示 +- ✅ 生命周期管理和资源释放 +- ✅ 异常处理和日志记录 + +## 💡 使用建议 + +1. **快速判断**: 通过文字颜色快速了解网络质量 +2. **具体类型**: 通过文字内容了解具体网络类型 +3. **问题诊断**: 看到感叹号时表示网络连接正常但服务不可达 +4. **详细信息**: 点击查看更完整的网络状态信息 + +现在网络状态指示器更加直观和实用,用户可以立即知道当前使用的是什么类型的网络连接!🎉 \ No newline at end of file