背景描述

本篇文章补充一下之前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. python游戏-练习项目19:使用python制作游戏(上)
  2. easyui启用行号错位解决方案
  3. Vue 实现前后端分离项目
  4. lol新服务器怎么发信息,《英雄联盟手游》国服新消息 最新玩法发布
  5. cs1.5 linux服务端,CS1.5在linux上的配置
  6. 三种背包问题的例题(各一道)
  7. Android SQL语句实现数据库的增删改查
  8. 洛谷P2023 [AHOI2009]维护序列
  9. VC++实现标准型计算器步骤及源码
  10. 各省简称 拼音 缩写_中国各省、直辖市、自治区名称汉语拼音字母缩
  11. 3389、1433、3306抓鸡原理和工具教程(原理篇)
  12. CAN资料整理(二):CAN协议帧格式
  13. 【usaco 2013 feb Bronze】计算周长
  14. HTML5 进阶系列:文件上传下载
  15. 基于友盟+U-APM解决客户小姐姐Android Native Crash问题,小姐姐说我真棒,要把她闺蜜介绍给我
  16. 蚂蚁微贷互动营销技术体系实践
  17. 软件测试的类型有那些?都有什么不同?
  18. java 必须try catch的异常_【java基础之异常】死了都要try,不淋漓尽致地catch我不痛快!...
  19. PHP:【微信小程序】初识微信小程序,微信小程序配置
  20. 配置clion用于stm32开发

热门文章

  1. Linux脚本编程:sudo命令下设置定时任务
  2. 基于区域增长的可视人彩色图像分割
  3. 登录注册功能的实现详解(多用户名注册、案例补充)
  4. android 虚拟器版本,安卓虚拟机Android-X86更新至4.4版本
  5. 105K Star的GitHub项目再陷风波,其托管商惨遭三大唱片公司起诉
  6. 多个List 如何取并集、交集
  7. linux命令对两个文件求差集、交集、并集
  8. 计算机语言的发展历程和发展趋势
  9. 软考高级 真题 2012年下半年 信息系统项目管理师 综合知识
  10. 趣抖音短视频站在行业风口,如何脱颖而出?