android的工具栏是下滑打开,IOS的是上滑打开,项目有个需求要上滑打开工具栏。android下滑打开工具栏是根据手势判断,既然能判断下滑就能判断上滑,然后就到代码中找。
之前有修改过下拉栏的bug,滑动事件在frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java中,但是这里只能监听下滑过程中滑动事件,只能继续找。
android界面是显示在window中,window的管理是在PhoneWindowManager.java中,在PWM中的init()方法看到如下代码
mSystemGestures = new SystemGesturesPointerEventListener(context,
new SystemGesturesPointerEventListener.Callbacks() {
@Override
public void onSwipeFromTop() {
if (mStatusBar != null) {
requestTransientBars(mStatusBar);
}
}
@Override
public void onSwipeFromBottom() {
if (mNavigationBar != null && mNavigationBarPosition == NAV_BAR_BOTTOM) {
requestTransientBars(mNavigationBar);
}
}
@Override
public void onSwipeFromRight() {
if (mNavigationBar != null && mNavigationBarPosition == NAV_BAR_RIGHT) {
requestTransientBars(mNavigationBar);
}
}
@Override
public void onSwipeFromLeft() {
if (mNavigationBar != null && mNavigationBarPosition == NAV_BAR_LEFT) {
requestTransientBars(mNavigationBar);
}
}
@Override
public void onFling(int duration) {
if (mPowerManagerInternal != null) {
mPowerManagerInternal.powerHint(
PowerHint.INTERACTION, duration);
}
}
@Override
public void onDebug() {
// no-op
}
@Override
public void onDown() {
mOrientationListener.onTouchStart();
}
@Override
public void onUpOrCancel() {
mOrientationListener.onTouchEnd();
}
@Override
public void onMouseHoverAtTop() {
mHandler.removeMessages(MSG_REQUEST_TRANSIENT_BARS);
Message msg = mHandler.obtainMessage(MSG_REQUEST_TRANSIENT_BARS);
msg.arg1 = MSG_REQUEST_TRANSIENT_BARS_ARG_STATUS;
mHandler.sendMessageDelayed(msg, 500);
}
@Override
public void onMouseHoverAtBottom() {
mHandler.removeMessages(MSG_REQUEST_TRANSIENT_BARS);
Message msg = mHandler.obtainMessage(MSG_REQUEST_TRANSIENT_BARS);
msg.arg1 = MSG_REQUEST_TRANSIENT_BARS_ARG_NAVIGATION;
mHandler.sendMessageDelayed(msg, 500);
}
@Override
public void onMouseLeaveFromEdge() {
mHandler.removeMessages(MSG_REQUEST_TRANSIENT_BARS);
}
});
通过方法名可以看出onSwipeFromTop()是下滑手势,onSwipeFromBottom()是上滑手势,onSwipeFromRight()是左滑手势,onSwipeFromLeft()是右滑手势,验证是不是理解正确,在每个方法中加上log,编译验证一下,验证的结果和预期的一样。现在修改需求就简单,在onSwipeFromBottom()中添加自己的逻辑即可。
延伸一下,IOS可以右滑返回上一个页面,右滑不就相当于点击返回按键吗,既然现在可以监听到右滑的手势,在onSwipeFromLeft()添加点击返回按键逻辑不就可以实现右滑返回上一个页面的功能吗,试验一下,确实可以这样实现。