上文分析了状态栏的布局关系,本文主要记录一些基础的修改,如状态栏和qs背景修改、去除亮度调节条、返回直接关闭状态栏等比较细微散乱的修改。
1. 去除背景色
上文提到到背景前景色都是ScrimView,所以修改ScrimView即可:
ScrimView.java->onDraw()方法修改:
@Override
protected void onDraw(Canvas canvas) {
//ScrimView:qs面板出来后的bg、fg蒙板
if (mDrawAsSrc || mDrawable.getAlpha() > 0) {
PorterDuff.Mode mode = mDrawAsSrc ? PorterDuff.Mode.SRC : PorterDuff.Mode.SRC_OVER;
//改为绘制颜色透明色,去除灰色蒙板
canvas.drawColor(Color.TRANSPARENT, mode);
//以下为源码,注释即可
/**if (!mHasExcludedArea) {
...
**/
}
}
将蒙板绘制改为绘制透明色。
2. QS面板主体部分背景
对应 qs_panel.xml:
<View
android:id="@+id/quick_settings_background"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@drawable/qs_background_primary"
android:elevation="4dp" />
修改qs_background_primary即可
<inset xmlns:android="http://schemas.android.com/apk/res/android">
<shape>
<!-- qs_background_dark 改为 8effffff -->
<solid android:color="#6effffff" />
<!-- 圆角改为10dp -->
<corners android:radius="10dp" />
</shape>
</inset>
3.展开时状态栏背景色
同样是qs_panel.xml 文件
<View
android:id="@+id/quick_settings_status_bar_background"
android:layout_width="match_parent"
android:layout_height="@*android:dimen/quick_qs_offset_height"
android:background="#00000000"
android:clipChildren="false"
android:clipToPadding="false" />
修改background即可。
4.去除Header中的 “日期、手机状态图标栏”
即上图2的地方,对应quick_status_bar_expanded_header.xml
<include layout="@layout/quick_qs_status_icons"
android:visibility="gone"/>
<com.android.systemui.qs.QuickQSPanel
android:layout_marginTop="80dp"
....
/>
QuickQSPanel位于quick_qs_status_icons下方,隐藏它后相应加个marginTop。
5.默认展开全部
源码默认下拉时只显示header和通知栏部分(见4中的图片),修改为下拉直接完全展开快捷设置面板,NotificationPanelView.java->isOpenQsEvent直接返回true即可
private boolean isOpenQsEvent(MotionEvent event) {
.....
//直接返回true,展开整个qs面板
return true;
}
6.点击返回直接关闭状态栏
原生效果是当前展示的是header时按下返回键关闭页面,如果当前是Qs面板完全展开则先关闭展开项,滑动到header,再次点返回才会关闭页面。
StatusBar.java修改onBackPressed方法:
public boolean onBackPressed() {
...
if (mNotificationPanel.isQsExpanded()) {
if (mNotificationPanel.isQsDetailShowing()) {
mNotificationPanel.closeQsDetail();
} else {
// mNotificationPanel.animateCloseQs(); //只关闭qs展开部分 animateCollapsePanels(); //关闭整个qs面板
}
return true;
}
....
}
7.上滑直接关闭菜单
原生在Qs面板上上滑时的表现与back键类似,先折叠到header,再次上滑才会关闭整个页面。NotificationPanelView.java修改onQsIntercept方法:
private boolean onQsIntercept(MotionEvent event) {
...
case MotionEvent.ACTION_MOVE:
....
//以下代码用于拦截事件,返回true则不会直接关闭整个面板,而是先折叠,显示header ,注释掉
/**
if (Math.abs(h) > mTouchSlop && Math.abs(h) > Math.abs(x - mInitialTouchX)
&& shouldQuickSettingsIntercept(mInitialTouchX, mInitialTouchY, h)) {
mQsTracking = true;
onQsExpansionStarted();
notifyExpandingFinished();
mInitialHeightOnTouch = mQsExpansionHeight;
mInitialTouchY = y;
mInitialTouchX = x;
mIntercepting = false;
mNotificationStackScroller.cancelLongPress();
return true;
}
**/
break;
....
}
注释MotionEvent.ACTION_MOVE中的拦截方法。
8.去掉亮度条
亮度调节条在QSPanel.java中创建,直接设置Visibility
public QSPanel(Context context, AttributeSet attrs) {
...
addView(mBrightnessView);
//创建完隐藏掉
mBrightnessView.setVisibility(GONE);
....
}
@Override
public void onTuningChanged(String key, String newValue) {
if (QS_SHOW_BRIGHTNESS.equals(key)) {
// 这里会显示亮度条,注释掉
// updateViewVisibilityForTuningValue(mBrightnessView, newValue);
}
}
onTuningChanged方法也会显示亮度条,同样注释掉。