• Android 状态栏显示运营商名称


    Android 原生设计中在锁屏界面会显示运营商名称,用户界面中,大概是基于 icon 数量长度显示考虑,对运营商名称不作显示。但是国内基本都加上运营商名称。对图标显示长度优化基本都是:缩小运营商字体、限制字数长度、信号图标压缩上下叠加等。

    SIM卡的 icon 对应的文件是 StatusBarMobileView,默认包含信号格、漫游、网络制式、上下行等图标。只需要在默认基础上,添加运营商名称View。

     一、添加运营商名称view

    在信号格后面增加运营商名称,System中对文字图标显示自定义 AutoMarqueeTextView 类(主要增加跑马灯和省略号的样式自动切换)处理,我们使用 AutoMarqueeTextView 显示名称即可。

    1. //frameworks/base/packages/SystemUI/res/layout/status_bar_mobile_signal_group.xml
    2. <FrameLayout
    3. android:layout_width="wrap_content"
    4. android:layout_height="wrap_content"
    5. android:layout_gravity="center_vertical">
    6. <com.android.systemui.statusbar.AnimatedImageView
    7. android:id="@+id/mobile_signal"
    8. android:layout_height="wrap_content"
    9. android:layout_width="wrap_content"
    10. systemui:hasOverlappingRendering="false"
    11. />
    12. <ImageView
    13. android:id="@+id/mobile_roaming"
    14. android:layout_width="wrap_content"
    15. android:layout_height="wrap_content"
    16. android:src="@drawable/stat_sys_roaming"
    17. android:contentDescription="@string/data_connection_roaming"
    18. android:visibility="gone" />
    19. FrameLayout>
    20. <com.android.systemui.util.AutoMarqueeTextView
    21. android:id="@+id/qs_carrier_text"
    22. android:layout_width="wrap_content"
    23. android:layout_height="wrap_content"
    24. android:layout_weight="1"
    25. android:textAppearance="@style/TextAppearance.QS.Status"
    26. android:textDirection="locale"
    27. android:textSize="8dp"
    28. android:marqueeRepeatLimit="marquee_forever"
    29. android:singleLine="true"
    30. android:maxEms="4"/>

    然后调整好文字大小和长度适配。

    二、对网络制式、上下行漫游图标长度压缩

    默认图标都是从左到右排序的,这样会导致整体icon太长,状态栏放不下,从而导致icon被收到省略号中无法显示。

    1. //frameworks/base/packages/SystemUI/res/layout/status_bar_mobile_signal_group.xml
    2. <com.android.keyguard.AlphaOptimizedLinearLayout
    3. android:id="@+id/mobile_group"
    4. android:layout_width="wrap_content"
    5. android:layout_height="match_parent"
    6. android:gravity="center_vertical"
    7. android:orientation="horizontal" >
    8. <ImageView
    9. android:id="@+id/mobile_volte"
    10. android:layout_height="wrap_content"
    11. android:layout_width="wrap_content"
    12. android:visibility="gone"
    13. android:paddingEnd="2dp"/>
    14. <LinearLayout
    15. android:layout_width="wrap_content"
    16. android:layout_height="match_parent"
    17. android:orientation="vertical">
    18. <FrameLayout
    19. android:layout_height="10dp"
    20. android:layout_width="10dp">
    21. <ImageView
    22. android:id="@+id/mobile_type"
    23. android:layout_height="wrap_content"
    24. android:layout_width="wrap_content"
    25. android:layout_marginTop="1dp"
    26. android:visibility="gone" />
    27. FrameLayout>
    28. <FrameLayout
    29. android:id="@+id/inout_container"
    30. android:layout_height="10dp"
    31. android:layout_width="10dp"
    32. android:layout_gravity="center_horizontal">
    33. <ImageView
    34. android:id="@+id/mobile_in"
    35. android:layout_height="10dp"
    36. android:layout_width="10dp"
    37. android:src="@drawable/ic_activity_down"
    38. android:visibility="gone"
    39. />
    40. <ImageView
    41. android:id="@+id/mobile_out"
    42. android:layout_height="10dp"
    43. android:layout_width="10dp"
    44. android:src="@drawable/ic_activity_up"
    45. android:visibility="gone"
    46. />
    47. FrameLayout>
    48. LinearLayout>
    49. <Space
    50. android:id="@+id/mobile_roaming_space"
    51. android:layout_height="match_parent"
    52. android:layout_width="0dp"
    53. android:visibility="gone"
    54. />

    把子view直接的space都设置为0,再把4g图标和上下行图标缩小放到一列中。

     三、 运营商名称显示

    获取运营商名称接口常用有两种

    SubscriptionInfo.getCarrierName()
    SubscriptionInfo.getDisplayName()

    区别在第一种显示的内容更多,类似:CHN-CT中国电信。这里一般只想显示中国电信,使用第二个方法就行。

    1. //frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java
    2. private DualToneHandler mDualToneHandler;
    3. private ImageView mVolte;
    4. + private TextView mCarrierText;
    5. + private SubscriptionManager mSubscriptionManager;
    6. public static StatusBarMobileView fromContext(Context context, String slot) {
    7. LayoutInflater inflater = LayoutInflater.from(context);
    8. @@ -80,6 +85,7 @@
    9. public StatusBarMobileView(Context context, AttributeSet attrs) {
    10. super(context, attrs);
    11. + mSubscriptionManager = SubscriptionManager.from(context);
    12. }
    13. public StatusBarMobileView(Context context, AttributeSet attrs, int defStyleAttr) {
    14. @@ -113,6 +119,9 @@
    15. mOut = findViewById(R.id.mobile_out);
    16. mInoutContainer = findViewById(R.id.inout_container);
    17. mVolte = findViewById(R.id.mobile_volte);
    18. + mCarrierText = findViewById(R.id.qs_carrier_text);
    19. + mCarrierText.setText("");
    20. mMobileDrawable = new SignalDrawable(getContext());
    21. mMobile.setImageDrawable(mMobileDrawable);
    22. @@ -159,6 +168,11 @@
    23. setVisibility(View.INVISIBLE);
    24. requestLayout();
    25. }
    26. + SubscriptionInfo subscriptionInfo = mSubscriptionManager.getActiveSubscriptionInfo(mState.subId);
    27. + if (subscriptionInfo != null) {
    28. + CharSequence cName = subscriptionInfo.getDisplayName();
    29. + mCarrierText.setText(cName);
    30. + }
    31. }
    32. private void initViewState() {
    33. @@ -194,6 +208,11 @@
    34. }else {
    35. mVolte.setVisibility(View.GONE);
    36. }
    37. + SubscriptionInfo subscriptionInfo = mSubscriptionManager.getActiveSubscriptionInfo(mState.subId);
    38. + if (subscriptionInfo != null) {
    39. + CharSequence cName = subscriptionInfo.getDisplayName();
    40. + mCarrierText.setText(cName);
    41. + }
    42. }

    StatusBarMobileView 中动态获取刷新运营商名称。针对状态栏中icon颜色,设计是有要求的,需要根据背景的变化进行适应。在浅色背景显示深色,深色背景显示浅色,有一定对比度才行。

    1. //frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java
    2. private boolean updateState(MobileIconState state) {
    3. @@ -258,6 +277,8 @@
    4. mMobileRoaming.setImageTintList(color);
    5. mDotView.setDecorColor(tint);
    6. mDotView.setIconColor(tint, false);
    7. + int foreground = mDualToneHandler.getSingleColor(intensity);
    8. + mCarrierText.setTextColor(foreground);
    9. }
    10. @Override
    11. @@ -288,6 +309,7 @@
    12. @Override
    13. public void setDecorColor(int color) {
    14. mDotView.setDecorColor(color);
    15. + mCarrierText.setTextColor(color);
    16. }

    四、隐藏原生锁屏界面运营商显示

    原生设计会在锁屏界面只显示SIM卡运营商。状态栏增加自定义的显示后,锁屏界面可以删除。对应 View 

    frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java

    中的 mCarrierLabel ,设置隐藏即可。

  • 相关阅读:
    基于粒子群优化算法的UAV三维路径规划研究付Matlab代码
    【python科研绘图】多分类多字段箱型图或者小提琴图绘制
    echarts环图配置
    使用ceph-deploy部署Ceph集群
    Linux代码调试----gdb使用介绍
    51单片机学习:ADC模数转换实验--光敏电阻AD采集
    NgRx不使用effect,怎样将数据存入store
    Mac M1 问题记录
    vscode 阅读 linux kernel 源码
    设计模式的基础知识
  • 原文地址:https://blog.csdn.net/tq501501/article/details/132368932