背景描述

本篇文章补充一下之前https://blog.csdn.net/a396604593/article/details/123487805文章中的一些没填上的坑。
此代码基于Android 12

上篇:Launcher功能入口
上篇:launcher功能入口(二)
本篇:launcher功能入口(三)

Launcher滑动分析

10、上滑进入recent
packages\apps\Launcher3\quickstep\src\com\android\launcher3\uioverrides\touchcontrollers\NoButtonNavbarToOverviewTouchController.java

public void onDragStart(boolean start, float startDisplacement) {if (handlingOverviewAnim()) {//判断是否拦截//设置停顿监听mMotionPauseDetector.setOnMotionPauseListener(this::onMotionPauseDetected);}
}//mDidTouchStartInNavBar赋值@Overrideprotected boolean canInterceptTouch(MotionEvent ev) {mDidTouchStartInNavBar = (ev.getEdgeFlags() & EDGE_NAV_BAR) != 0;return super.canInterceptTouch(ev);}//判断时在底部上滑,并且在主界面private boolean handlingOverviewAnim() {int stateFlags = SystemUiProxy.INSTANCE.get(mLauncher).getLastSystemUiStateFlags();return mDidTouchStartInNavBar && mStartState == NORMAL&& (stateFlags & SYSUI_STATE_OVERVIEW_DISABLED) == 0;}
//运动暂停检测,recent的触发是底部上滑并且停顿了一下,就会进入recent界面(Android 12,之前版本的recent触发有所不同)
mMotionPauseDetector.addPosition(event);
//取消mCurrentAnimation动画,进入recent
private void onMotionPauseDetected() {if (mCurrentAnimation == null) {return;}mNormalToHintOverviewScrimAnimator = null;mCurrentAnimation.getTarget().addListener(newCancelListener(() ->mLauncher.getStateManager().goToState(OVERVIEW, true, forSuccessCallback(() -> {mOverviewResistYAnim = AnimatorControllerWithResistance.createRecentsResistanceFromOverviewAnim(mLauncher, null).createPlaybackController();mReachedOverview = true;maybeSwipeInteractionToOverviewComplete();}))));mCurrentAnimation.getTarget().removeListener(mClearStateOnCancelListener);mCurrentAnimation.dispatchOnCancel();mStartedOverview = true;VibratorWrapper.INSTANCE.get(mLauncher).vibrate(OVERVIEW_HAPTIC);}

12、上滑进入all apps
1、packages\apps\Launcher3\src\com\android\launcher3\touch\BaseSwipeDetector.java
处理触摸滚动事件

public boolean onTouchEvent(MotionEvent ev) {...}

2、packages\apps\Launcher3\src\com\android\launcher3\touch\AbstractStateChangeTouchController.java
中判断滑动距离或者速度,决定进入或者不进入allapps

public void onDragEnd(float velocity) {...if (fling) {targetState =Float.compare(Math.signum(velocity), Math.signum(mProgressMultiplier)) == 0? mToState : mFromState;// snap to top or bottom using the release velocity} else {targetState =(interpolatedProgress > SUCCESS_TRANSITION_PROGRESS) ? mToState : mFromState;}
...
}

注意:mCurrentAnimation动画负责进入退出all apps
没有直接调用packages\apps\Launcher3\src\com\android\launcher3\statemanager\StateManager.java中的goToState方法。

12.1、上滑进入应用列表界面透明度变化

packages/apps/Launcher3/src/com/android/launcher3/allapps/AllAppsTransitionController.java
setAlphas中处理

12.2、快速滑动进入退出allapps界面速度分析
packages/apps/Launcher3/src/com/android/launcher3/touch/SwipeDetector.java

private void reportDragEnd() {mVelocityTracker.computeCurrentVelocity(1000, mMaxVelocity);//速度计算,计算一秒滑过多少像素float velocity = mDir.getVelocity(mVelocityTracker, mIsRtl) / 1000;//一秒钟滑动过多少k像素if (DBG) {Log.d(TAG, String.format("onScrollEnd disp=%.1f, velocity=%.1f",mDisplacement, velocity));}//mListener.onDragEnd(velocity, Math.abs(velocity) > RELEASE_VELOCITY_PX_MS);//传入速度和速递阈值判断,速度大于1k 才认为是fling
}

packages/apps/Launcher3/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java

onDragEnd根据参数判断是否是fling 如果是 则进入或者退出allapps, 如果不是 判断动画距离是否过半,如果超过0.5f 则改变状态,否则回到上一个状态

13、桌面下拉显示通知栏
packages\apps\Launcher3\quickstep\src\com\android\launcher3\uioverrides\touchcontrollers\StatusBarTouchController.java
StatusBarTouchController拦截滑动事件并传递给systemui

//事件拦截
private boolean canInterceptTouch(MotionEvent ev) {...}
//事件分发
private void dispatchTouchEvent(MotionEvent ev) {if (mSystemUiProxy.isActive()) {mLastAction = ev.getActionMasked();mSystemUiProxy.onStatusBarMotionEvent(ev);}}

触摸事件流程总结

1、触摸事件的根是从packages\apps\Launcher3\src\com\android\launcher3\dragndrop\DragLayer.java分发下来。
packages\apps\Launcher3\src\com\android\launcher3\views\BaseDragLayer.java中找到处理事件对应的controller
然后由具体的controller处理滑动事件。

private TouchController findControllerToHandleTouch(MotionEvent ev) {AbstractFloatingView topView = AbstractFloatingView.getTopOpenView(mActivity);if (topView != null&& (isEventInLauncher(ev) || topView.canInterceptEventsInSystemGestureRegion())&& topView.onControllerInterceptTouchEvent(ev)) {return topView;}for (TouchController controller : mControllers) {if (controller.onControllerInterceptTouchEvent(ev)) {Log.d("TouchController","TouchController: "+controller);return controller;}}return null;}

2、TouchController 接口,主要关注onControllerTouchEvent和onControllerInterceptTouchEvent方法。
触摸事件都在TouchController的实现类中进行。比较多,这里就不贴出来了

public interface TouchController {/*** Called when the draglayer receives touch event.*/boolean onControllerTouchEvent(MotionEvent ev);/*** Called when the draglayer receives a intercept touch event.*/boolean onControllerInterceptTouchEvent(MotionEvent ev);/*** Called when one handed mode state changed*/default void onOneHandedModeStateChanged(boolean activated) { }default void dump(String prefix, PrintWriter writer) { }
}

3、launcher中滑动处理比较多,有时候找不到对应的处理逻辑。
要忽略复杂多变的实现类,从事件传递根或者重要接口出发,判断是哪个实现类拦截处理了触摸事件。
然后再找具体的拦截判断和触摸事件处理逻辑

implements TouchController, SingleAxisSwipeDetector.Listener

InputConsumer输入事件

https://blog.csdn.net/a396604593/article/details/123487805中
11、三方应用界面上滑返回launcher
简单写了一下三方应用界面上滑launcher怎么处理输入事件。
跟踪此类问题和触摸事件类似,实现类比较多,要多关注接口。有一个整体的逻辑之后再看具体的处理

也可以看一下其它人写的https://blog.csdn.net/tq501501/article/details/120002676还不错。

16、主屏幕设置–通知圆点

有时候通知圆点显示三角形,没有默认赋予权限。
配置config_defaultListenerAccessPackages即可,framework下面的不生效需要查一下是否gms包覆盖掉了:
vendor/partner_gms/overlay/GmsConfigOverlayCommon/res/values/config.xml

    <!-- Colon separated list of package names that should be granted Notification Listener access --><string name="config_defaultListenerAccessPackages" translatable="false">com.android.launcher3:com.google.android.projection.gearhead</string>

临时验证:

adb shell  settings put secure enabled_notification_listeners com.google.android.projection.gearhead/com.google.android.gearhead.notifications.SharedNotificationListenerManager$ListenerService:com.android.launcher3/com.android.launcher3.notification.NotificationListener

之前写过一点流程,忘记了,这里加一个跳转链接https://blog.csdn.net/a396604593/article/details/128025161

launcher功能入口(三)相关推荐

  1. launcher功能入口(二)

    前言 本篇文章补充一下之前https://blog.csdn.net/a396604593/article/details/123487805文章中的一些没填上的坑. 此代码基于Android 12 ...

  2. Launcher功能入口

    launcher各种功能入口 1.点击事件.点击图标.点击文件夹等等 ItemClickHandler.java public static final OnClickListener INSTANC ...

  3. 关于如何解决Windows10任务栏无响应问题及任务栏“咨询和兴趣”功能入口彻底关闭

    关于如何解决Windows10任务栏无响应问题及任务栏"咨询和兴趣"功能入口彻底关闭 一.前言 二.过程 (1)资源管理器 (2)新的问题,新的发现 (3)锁定"咨询与兴 ...

  4. SpringBoot中使用Easyexcel实现Excel导入导出功能(三)

    导出的数据包含有图片 导出excel表格的数据包含有图片,这种场景比较少.通Easyexcel实现这样的需求,我认为最简便的方法就是使用前面提到的自定义转换器(com.alibaba.excel.co ...

  5. Android 12.0 屏蔽FallbackHome机制去掉android正在启动直接进入默认Launcher功能实现

    目录 1.概述 2.屏蔽FallbackHome机制去掉android正在启动直接进入默认Launcher功能实现的核心类

  6. javascript的等于和不等于运算符用法与功能(三)

    javascript的常见运算符用法与功能(三) 这里所纪录的运算符是javascript中的等于(==)和不等于(!=),这两种运算符. //返回的结果为布尔值. var a='1'; var b= ...

  7. 什么是功能入口设计---上海天象网络技术有限公司

    什么是功能入口设计---上海天象网络技术有限公司 个人中心其核心模块其实就是功能入口,因此清晰.有层次的布局尤为重要,功能入口我大概统计了有2种表现形式:列表式.宫格式. 1.列表式 列表式是最常见的 ...

  8. Android中实现Launcher功能之四---滑屏初探 scrollTo 以及 scrollBy方法使用说明

     本文原创 ,转载必须注明出处 :http://blog.csdn.net/qinjuning 今天给大家介绍下Android中滑屏功能的一个基本实现过程以及原理初探,最后给大家重点讲解View视图中 ...

  9. SAP Marketing Cloud功能简述(三) 营销活动内容设计和产品推荐

    Grace的前两篇文章: SAP Marketing Cloud功能简述(一) : Contacts和Profiles SAP Marketing Cloud功能简述(二) : Target Grou ...

最新文章

  1. 学车比学计算机简单,帅哥自述:学车比上班还要累
  2. python缩进符错误_python – 如何修复Pylint“错误的缩进”和PEP8 E121?
  3. linux 虚拟机挂载本地,CentOS 在VMWare中挂载本地yum源
  4. Go的web工作原理
  5. selenium-python:运行后报浏览器不兼容 disconnected: unable to connect to renderer
  6. SQL查询语句精华 笔记
  7. VSCode下载与安装
  8. 自动驾驶:车道线检测、车速检测、实时通行跟踪、基于视频的车辆跟踪及流量统计
  9. 用canvas画圆形图片
  10. 点计算机管理 显示文件缺失,电脑开机显示文件丢失怎么回事
  11. 滴滴云A100 40G 性能测试 V100陪练!
  12. input文本框输入溢出的时候,鼠标悬停显示全部信息
  13. 浅谈slf4j,logger中的{}功能
  14. 如何在群里引流?如何通过别人的群引流?建一个群怎么快速裂变引流
  15. FreeMind打开提示This application requires Java Runtime Environment XX
  16. 三天让车跑起来!stm32循迹车 —— 第一天:基本模块使用方法
  17. 用pycharm写飞机大战
  18. 身边35岁程序员如何建立起技术护城河?
  19. linux filo顺序是什么意思,嵌入式系统复习 南京邮电大学 期末复习 答案 提纲
  20. python 给指定的时间找年周期

热门文章

  1. TCP/IP连接释放
  2. 用Compose实现手写春联效果
  3. Python3 数字组合
  4. NEMA数据经纬度转换
  5. Kafka主题(Topic)的管理
  6. 大致总结一下 安卓各大版本的差异(安卓4以上版本)
  7. markdown 摘记
  8. 基于M实现的JWT解决方案
  9. NYOJ597 完数?
  10. 现代人工智能走在仿生学的大道上