Android 13 修改Framework,监听屏幕手势滑动(SystemUI左右侧滑/手势导航)、监听屏幕上下根部往相对一侧滑动。

写在前面: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的错误:
在这里插入图片描述
  解决方法:在如下位置添加配置
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苏苏码不动了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值