赵明涛 4 days ago
parent
commit
911c1357ee
  1. 187
      app/src/main/java/com/ouxuan/oxface/network/NetworkStatusIndicator.java
  2. 95
      网络状态指示器文字显示更新说明.md

187
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());
}
// 更新文字颜色
networkTextView.setTextColor(status.getColor());
/**
* 创建网络图标
*/
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;
}
// 保存显示文字
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, "网络状态指示器已销毁");

95
网络状态指示器文字显示更新说明.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. **详细信息**: 点击查看更完整的网络状态信息
现在网络状态指示器更加直观和实用,用户可以立即知道当前使用的是什么类型的网络连接!🎉
Loading…
Cancel
Save