Android 5.1 SystemUI 状态栏修改

    由于工作需要,希望修改android5.1的SystemUI,默认Android5.1的SystemUI状态栏,下滑的时候,只会出现的屏幕中间的。不管你下拉从屏幕顶端哪里下滑状态栏。我们需要状态栏出现的位置由下滑的位置决定,因为我们的机器是15.6寸的,所以必须这样修改。
    android5.1SystemUI的statusBar 实际上主要布局文件是super_status_bar.xml ,这个布局文件包括status_bar_expanded.xml
<com.android.systemui.statusbar.phone.PanelHolder
        android:id="@+id/panel_holder"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/transparent" >
        <include layout="@layout/status_bar_expanded"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="gone" />
    </com.android.systemui.statusbar.phone.PanelHolder>

status_bar_expanded.xml包括下拉后显示的头和通知和快速设置

<com.android.systemui.statusbar.phone.NotificationPanelView 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
    android:id="@+id/notification_panel"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent"
    >

    <include
        layout="@layout/carrier_label"
        android:layout_height="@dimen/carrier_label_height"
        android:layout_width="match_parent"
        android:layout_marginBottom="@dimen/close_handle_height"
        android:layout_gravity="bottom"
        />

    <include
        layout="@layout/keyguard_status_view"
        android:layout_height="wrap_content"
        android:visibility="gone" />

    <TextView
        android:id="@+id/emergency_calls_only"
        android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Network.EmergencyOnly"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:padding="4dp"
        android:gravity="center"
        android:visibility="gone"
        />

    <com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="@integer/notification_panel_layout_gravity"
        android:id="@+id/notification_container_parent"
        android:clipToPadding="false"
        android:clipChildren="false">

        <com.android.systemui.statusbar.phone.ObservableScrollView
            android:id="@+id/scroll_view"
            android:layout_width="@dimen/notification_panel_width"
            android:layout_height="match_parent"
            android:layout_gravity="@integer/notification_panel_layout_gravity"
            android:scrollbars="none"
            android:overScrollMode="never"
            android:fillViewport="true">
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">
                <include
                    layout="@layout/qs_panel"
                    android:layout_marginTop="@dimen/status_bar_header_height_expanded"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="@dimen/notification_side_padding"
                    android:layout_marginRight="@dimen/notification_side_padding"/>

                <!-- A view to reserve space for the collapsed stack -->
                <!-- Layout height: notification_min_height + bottom_stack_peek_amount -->
                <View
                    android:id="@+id/reserve_notification_space"
                    android:layout_height="@dimen/min_stack_height"
                    android:layout_width="match_parent"
                    android:layout_marginTop="@dimen/notifications_top_padding" />

                <View
                    android:layout_height="@dimen/notification_side_padding"
                    android:layout_width="match_parent" />
            </LinearLayout>
        </com.android.systemui.statusbar.phone.ObservableScrollView>

        <com.android.systemui.statusbar.stack.NotificationStackScrollLayout
            android:id="@+id/notification_stack_scroller"
            android:layout_width="@dimen/notification_panel_width"
            android:layout_height="match_parent"
            android:layout_gravity="@integer/notification_panel_layout_gravity"
            android:layout_marginBottom="@dimen/close_handle_underlap"
            android:importantForAccessibility="no" />

        <ViewStub
            android:id="@+id/keyguard_user_switcher"
            android:layout="@layout/keyguard_user_switcher"
            android:layout_height="match_parent"
            android:layout_width="match_parent" />

        <include
            layout="@layout/keyguard_status_bar"
            android:visibility="invisible" />

    </com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer>

    <include
            layout="@layout/keyguard_bottom_area"
            android:visibility="gone" />

    <include layout="@layout/status_bar_expanded_header" />

    <com.android.systemui.statusbar.AlphaOptimizedView
        android:id="@+id/qs_navbar_scrim"
        android:layout_height="96dp"
        android:layout_width="match_parent"
        android:layout_gravity="bottom"
        android:visibility="invisible"
        android:background="@drawable/qs_navbar_scrim" />

</com.android.systemui.statusbar.phone.NotificationPanelView><

NotificationStackScrollLayout 是通知,如果用系统通知会显示在这里

<com.android.systemui.statusbar.phone.StatusBarHeaderView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:systemui="http://schemas.android.com/apk/res-auto"
    android:id="@+id/header"
    android:layout_width="@dimen/notification_panel_width"
    android:layout_height="@dimen/status_bar_header_height"
    android:layout_gravity="@integer/notification_panel_layout_gravity"
    android:paddingStart="@dimen/notification_side_padding"
    android:paddingEnd="@dimen/notification_side_padding"
    android:baselineAligned="false"
    android:elevation="4dp"
    android:background="@drawable/notification_header_bg"
    android:clickable="true"
    android:focusable="true"
    >

    <com.android.systemui.statusbar.phone.MultiUserSwitch android:id="@+id/multi_user_switch"
        android:layout_width="@dimen/multi_user_switch_width_collapsed"
        android:layout_height="@dimen/status_bar_header_height"
        android:layout_alignParentEnd="true"
        android:background="@drawable/ripple_drawable" >
        <ImageView android:id="@+id/multi_user_avatar"
            android:layout_width="@dimen/multi_user_avatar_expanded_size"
            android:layout_height="@dimen/multi_user_avatar_expanded_size"
            android:layout_gravity="center"
            android:scaleType="centerInside"/>
    </com.android.systemui.statusbar.phone.MultiUserSwitch>

    <com.android.keyguard.AlphaOptimizedImageButton android:id="@+id/settings_button"
        style="@android:style/Widget.Material.Button.Borderless"
        android:layout_toStartOf="@id/multi_user_switch"
        android:layout_width="48dp"
        android:layout_height="@dimen/status_bar_header_height"
        android:background="@drawable/ripple_drawable"
        android:src="@drawable/ic_settings"
        android:contentDescription="@string/accessibility_desc_settings" />

    <LinearLayout android:id="@+id/system_icons_super_container"
        android:layout_width="wrap_content"
        android:layout_height="@dimen/status_bar_header_height"
        android:layout_toStartOf="@id/multi_user_switch"
        android:layout_alignWithParentIfMissing="true"
        android:layout_marginStart="16dp"
        android:background="@drawable/ripple_drawable"
        android:paddingEnd="4dp" >
        <FrameLayout android:id="@+id/system_icons_container"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/status_bar_height"
            android:layout_gravity="center_vertical"
            >
            <include layout="@layout/system_icons" />
        </FrameLayout>
        <TextView android:id="@+id/battery_level"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_marginStart="@dimen/header_battery_margin_expanded"
            android:paddingEnd="@dimen/battery_level_padding_end"
            android:textColor="#ffffff"
            android:textSize="@dimen/battery_level_text_size"
            android:importantForAccessibility="noHideDescendants"/>
    </LinearLayout>

    <TextView
        android:id="@+id/header_emergency_calls_only"
        android:layout_height="@dimen/status_bar_header_height"
        android:layout_width="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_toStartOf="@id/system_icons_super_container"
        android:paddingStart="16dp"
        android:paddingEnd="16dp"
        android:visibility="gone"
        android:textAppearance="@style/TextAppearance.StatusBar.Expanded.EmergencyCallsOnly"
        android:text="@*android:string/emergency_calls_only"
        android:singleLine="true"
        android:gravity="center_vertical" />

    <FrameLayout
        android:id="@+id/date_group"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="@dimen/clock_collapsed_bottom_margin"
        android:layout_alignParentBottom="true">
        <com.android.systemui.statusbar.policy.DateView android:id="@+id/date_collapsed"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="16dp"
            android:singleLine="true"
            android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Date"
            android:layout_below="@id/clock"
            systemui:datePattern="@string/abbrev_wday_month_day_no_year_alarm"
            />

        <com.android.systemui.statusbar.policy.DateView android:id="@+id/date_expanded"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="16dp"
            android:singleLine="true"
            android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Date"
            android:layout_below="@id/clock"
            systemui:datePattern="eeeeMMMMd"
            />
    </FrameLayout>

    <include layout="@layout/split_clock_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_above="@id/date_group"
        android:id="@+id/clock"
        />

    <Button android:id="@+id/alarm_status"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_toEndOf="@id/date_group"
        android:layout_marginBottom="4dp"
        android:drawablePadding="6dp"
        android:drawableStart="@drawable/ic_access_alarms_small"
        android:textColor="#64ffffff"
        android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Date"
        android:paddingEnd="6dp"
        android:paddingStart="6dp"
        android:paddingTop="16dp"
        android:paddingBottom="16dp"
        android:background="?android:attr/selectableItemBackground"
        android:visibility="gone"
        />

    <include
        android:id="@+id/qs_detail_header"
        layout="@layout/qs_detail_header"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        />

    <com.android.systemui.statusbar.AlphaOptimizedImageView
        android:id="@+id/qs_detail_header_progress"
        android:src="@drawable/indeterminate_anim"
        android:alpha="0"
        android:background="@color/qs_detail_progress_track"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        />

    <TextView
        android:id="@+id/header_debug_info"
        android:visibility="invisible"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:fontFamily="sans-serif-condensed"
        android:textSize="11dp"
        android:textStyle="bold"
        android:textColor="#00A040"
        android:padding="2dp"
        />

</com.android.systemui.statusbar.phone.StatusBarHeaderView>

com.android.systemui.statusbar.phone.StatusBarHeaderView这个是头用于显示时间和电池图标等。
com.android.systemui.statusbar.stack.NotificationStackScrollLayout是快速设置的那一块。
当下滑发生的时候,我们需要记录下触摸的位置,然后当开始展开状态栏的时候我们要计算状态栏出现的位置。
PhoneStatusBar–>interceptTouchEvent函数用于获取下滑动作出现时的坐标记录如下:
panelTouchPos_x为我们定义的坐标变量
panelTouchPos_x=(int)event.getRawX();
然后在PhoneStatusBar–>updateExpandedViewPos()计算并修改菜单栏出现的位置。必须同时修改头和通知栏以及快速设置才可以。

 private int panelTouchPos_x = 0;
@Override
    public void updateExpandedViewPos(int thingy) {
        if (SPEW) Log.v(TAG, "updateExpandedViewPos");

        // on larger devices, the notification panel is propped open a bit
        mNotificationPanel.setMinimumHeight(
                (int)(mNotificationPanelMinHeightFrac * mCurrentDisplaySize.y));
        int statusBarWidth=mStatusBarWindow.getWidth();

        int left;

        FrameLayout.LayoutParams lp= (FrameLayout.LayoutParams)mHeader.getLayoutParams();
        int panelWidth=lp.width;
        if ((panelTouchPos_x+(panelWidth/2))>statusBarWidth){
            left=statusBarWidth-panelWidth;
        }else if(panelTouchPos_x<panelWidth/2) {
            left=0;
        }else{
            left=panelTouchPos_x-(panelWidth/2);
        }
        lp.gravity=Gravity.TOP|Gravity.LEFT;
        lp.setMargins(left,lp.topMargin,lp.rightMargin,lp.bottomMargin);
        mHeader.setLayoutParams(lp);
        ObservableScrollView mScrollView= (ObservableScrollView) this.mStatusBarWindow.findViewById(R.id.scroll_view);

        lp=(FrameLayout.LayoutParams)mScrollView.getLayoutParams();
        lp.gravity=Gravity.TOP|Gravity.LEFT;
        lp.setMargins(left,lp.topMargin,lp.rightMargin,lp.bottomMargin);
        mScrollView.setLayoutParams(lp);


        lp=(FrameLayout.LayoutParams)mStackScroller.getLayoutParams();
        lp.gravity=Gravity.TOP|Gravity.LEFT;
        lp.setMargins(left,lp.topMargin,lp.rightMargin,lp.bottomMargin);
        mStackScroller.setLayoutParams(lp);

        updateCarrierLabelVisibility(false);
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值