写在前面:Android13支持手势导航,设置中打开,SystemUI里实现,用户在屏幕左右侧 手势滑动执行返回功能,其实SystemUI调用的是Framework中现成的判断方法,这里贴出手势判断代码的位置,帮助需要做相关需求的同学
代码位置:frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.java
DisplayPolicy(WindowManagerService service, DisplayContent displayContent) {
mService = service;
mContext = displayContent.isDefaultDisplay ? service.mContext
: service.mContext.createDisplayContext(displayContent.getDisplay());
. . . . . .
. . . . . .
. . . . . .
// TODO(b/181821798) Migrate SystemGesturesPointerEventListener to use window context.
mSystemGestures = new SystemGesturesPointerEventListener(mUiContext, mHandler,
new SystemGesturesPointerEventListener.Callbacks() {
@Override
public void onSwipeFromTop() {
synchronized (mLock) {
final WindowState bar = mStatusBar != null
? mStatusBar
: findAltBarMatchingPosition(ALT_BAR_TOP);
requestTransientBars(bar, true /* isGestureOnSystemBar */);
}
}
@Override
public void onSwipeFromBottom() {
synchronized (mLock) {
final WindowState bar = mNavigationBar != null
&& mNavigationBarPosition == NAV_BAR_BOTTOM
? mNavigationBar
: findAltBarMatchingPosition(ALT_BAR_BOTTOM);
requestTransientBars(bar, true /* isGestureOnSystemBar */);
}
}
@Override
public void onSwipeFromRight() {
final Region excludedRegion = Region.obtain();
synchronized (mLock) {
mDisplayContent.calculateSystemGestureExclusion(
excludedRegion, null /* outUnrestricted */);
requestTransientBarsForSideSwipe(excludedRegion, NAV_BAR_RIGHT,
ALT_BAR_RIGHT);
}
excludedRegion.recycle();
}
@Override
public void onSwipeFromLeft() {
final Region excludedRegion = Region.obtain();
synchronized (mLock) {
mDisplayContent.calculateSystemGestureExclusion(
excludedRegion, null /* outUnrestricted */);
requestTransientBarsForSideSwipe(excludedRegion, NAV_BAR_LEFT,
ALT_BAR_LEFT);
}
+Intent intent = new Intent("onSwipeFromLeft_Action");
+mContext.sendBroadcast(intent);
+Log.d("onSwipeFromLeft"," 收到左侧侧滑");
excludedRegion.recycle();
}
注:如果APP里面想要监听滑动手势,可以直接在上面的方法onSwipeFromLeft、onSwipeFromRight、onSwipeFromBottom、onSwipeFromTop发广播出来接收,每次对应手势滑动都会调用到这里,亲测有效,在这里改比在SystemUI里改有效,SystemUI里还得打开手势导航才行,这里不需要。
直接加广播,运行时会报non-protected broadcast的错误:
解决方法:在如下位置添加配置