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()添加点击返回按键逻辑不就可以实现右滑返回上一个页面的功能吗,试验一下,确实可以这样实现。