问题描述:安卓13的原生状态栏是全屏的,然后就没有空白处,但是如果把下拉的通知栏宽度还原成安卓11的样式,那么就会产生空白处,这个时候点击空白处是没有任何反应的。
先看父类:alps_mssi/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java
protected boolean onEmptySpaceClick(float x) {
if (mHintAnimationRunning) {
return true;
}
return onMiddleClicked();
}
protected abstract boolean onMiddleClicked();
这个onEmptySpaceClick方法其实就是点击空白处的回调,返回了一个抽象方法onMiddleClicked()
看一下子类的具体实现:
alps_mssi/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
@Override
protected boolean onMiddleClicked() {
switch (mBarState) {
case StatusBarState.KEYGUARD:
if (!mDozingOnDown) {
if (mKeyguardBypassController.getBypassEnabled()) {
mUpdateMonitor.requestFaceAuth();
} else {
mLockscreenGestureLogger.write(MetricsEvent.ACTION_LS_HINT,
0 /* lengthDp - N/A */, 0 /* velocityDp - N/A */);
mLockscreenGestureLogger
.log(LockscreenUiEvent.LOCKSCREEN_LOCK_SHOW_HINT);
startUnlockHintAnimation();
}
}
return true;
case StatusBarState.SHADE_LOCKED:
if (!mQsExpanded) {
mStatusBarStateController.setState(StatusBarState.KEYGUARD);
}
return true;
default:
return true;
}
}
可以看到只是简单的处理了锁屏的逻辑,并未收起状态栏。点击了空白页面其实点击事件所返回的StatusBarState是SHADE,也就是说我们可以再添加一个case:
......
return true;
case StatusBarState.SHADE_LOCKED:
if (!mQsExpanded) {
mStatusBarStateController.setState(StatusBarState.KEYGUARD);
}
return true;
case StatusBarState.SHADE: //新加的
mView.post(mPostCollapseRunnable);
return false;
default:
return true;
}
然后在父类添加处理逻辑:
protected boolean onEmptySpaceClick(float x) {
if (mHintAnimationRunning) {
return true;
}
return onMiddleClicked();
}
protected final Runnable mPostCollapseRunnable = new Runnable() {
@Override
public void run() {
collapse(false /* delayed */, 1.0f /* speedUpFactor */);
}
}; //新加的逻辑
那这样就实现了安卓11的原生状态栏收起的功能