Android 信号强度显示图标修改

转自:http://my.oschina.net/zhang3/blog/16100

找了一找,显示信号对应的图片是:

stat_sys_signal_null.png

查找一下这个图片在其它地方有没有:

1 root@i3:~# cd frameworks/
2 root@i3:frameworks# find -name stat_sys_signal_null.png
3 ./base/docs/html/images/icon_design/stat_sys_signal_null.png
4 ./base/core/res/res/drawable-mdpi/stat_sys_signal_null.png
5 ./base/core/res/res/drawable-hdpi/stat_sys_signal_null.png

再找找哪里用到了这个图片:

1 root@i3:frameworks# grep -r stat_sys_signal_null ./
2 ./base/services/java/com/android/server/status/StatusBarPolicy.java:                null, com.android.internal.R.drawable.stat_sys_signal_null, 0, 0);
3 ./base/services/java/com/android/server/status/StatusBarPolicy.java:                mPhoneData.iconId = com.android.internal.R.drawable.stat_sys_signal_null;

找到了两处,其实是同一个文件,打开来看看吧:

01 private final void updateSignalStrength() {
02     int iconLevel = -1;
03     int[] iconList;
04  
05     // Display signal strength while in "emergency calls only" mode
06     if (!hasService() && !mServiceState.isEmergencyOnly()) {
07         //Slog.d(TAG, "updateSignalStrength: no service");
08         if (Settings.System.getInt(mContext.getContentResolver(),
09                 Settings.System.AIRPLANE_MODE_ON, 0) == 1) {
10             mPhoneData.iconId = com.android.internal.R.drawable.stat_sys_signal_flightmode;
11         else if( mModemPowerState == ModemPowerTracker.PowerState.TURNED_ON ) {
12             mPhoneData.iconId = com.android.internal.R.drawable.stat_sys_signal_init;
13         else {
14             mPhoneData.iconId = com.android.internal.R.drawable.stat_sys_signal_null;
15         }
16         mService.updateIcon(mPhoneIcon, mPhoneData, null);
17         return;
18     }

这处代码看起来像是3G信号。

1 // phone_signal
2 mPhone = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
3 mPhoneData = IconData.makeIcon("phone_signal",
4         null, com.android.internal.R.drawable.stat_sys_signal_null, 00);
5 mPhoneIcon = service.addIcon(mPhoneData, null);

这个应该是电话信号了。


### 自定义或修改 Android 系统中的信号强度图标Android 中自定义或修改系统级别的 Wi-Fi 或移动网络信号强度图标涉及多个方面的工作。由于这些图标通常由系统框架管理,因此直接替换它们可能需要具备一定的权限以及对 Android 开发环境的理解。 对于应用层面上实现类似的视觉反馈功能,则可以通过创建自定义 View 来完成这一目标[^1]。具体来说: #### 方法一:基于 Canvas 和 Paint 绘制 这种方法允许开发者完全控制绘图过程,可以灵活设计各种样式的Wi-Fi信号条形图或其他形式的表现方式。然而正如提到的那样,这种方式可能会相对复杂一些,并且如果处理不当可能导致性能问题或者难以达到预期的效果[^2]。 ```java // 示例代码片段用于说明如何利用Canvas绘制简单图形 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 设置画笔属性 Paint paint = new Paint(); paint.setColor(Color.GREEN); paint.setStrokeWidth(5f); // 假设这里有一个变量signalStrength代表当前信号等级 float signalHeight = getHeight() * (float)(signalStrength / maxSignalLevel); // 绘制矩形表示信号强度 RectF rect = new RectF(getPaddingLeft(), getHeight()-getPaddingBottom(), getWidth()-getPaddingRight(), getHeight()-getPaddingBottom()-signalHeight); canvas.drawRect(rect, paint); } ``` #### 方法二:使用 Drawable 资源文件切换显示不同状态下的图像 此方案更加直观易懂,适合初学者快速上手实践。只需要准备一组对应各个信号级别状态的小图标资源(如PNG格式),再编写逻辑判断语句根据实际接收到的数据选择合适的Drawable对象即可。 ```xml <!-- res/drawable/wifi_signal.xml --> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 定义不同状态下使用的图片 --> <item android:state_pressed="true" android:drawable="@drawable/ic_wifi_0"/> <item android:state_focused="true" android:drawable="@drawable/ic_wifi_1"/> ... </selector> ``` 需要注意的是,上述两种方法都属于应用程序内部的功能扩展,而不是真正意义上更改整个设备的操作界面元素。要改变全局范围内的UI组件样式往往涉及到更深层次的技术细节甚至是ROM定制层面的知识[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值