当前位置: 首页 > news >正文

网页设计企业宣传网站软文网站发布平台

网页设计企业宣传网站,软文网站发布平台,wordpress 账号密码,找哪个网站做摩配背景: vip学员在群里问到了一个分屏触摸区域设置的问题,开始以为就是和普通Activity设置区域没啥差别,都是在InputMonitor中进行的设置,但是仔细研究下来其实并不是哈。本文就带大家来手把手分析一下分屏情况下的触摸区域是怎么设置的。 d…

背景:

vip学员在群里问到了一个分屏触摸区域设置的问题,开始以为就是和普通Activity设置区域没啥差别,都是在InputMonitor中进行的设置,但是仔细研究下来其实并不是哈。本文就带大家来手把手分析一下分屏情况下的触摸区域是怎么设置的。
在这里插入图片描述

dumpsys input
在这里插入图片描述短信的触摸区域为上半屏幕
com.android.messaging/com.android.messaging.ui.conversationlist.ConversationListActivity
touchableRegion=[0,0][1440,1463]

电话的触摸区域为下半屏幕
com.android.dialer/com.android.dialer.main.impl.MainActivity
touchableRegion=[0,1498][1440,2960]

下面就来剖析出分屏情况下的touchableRegion是如何正确设置获取的。

原因分析追踪:

先来一个正常touchableRegion的传递流图
在这里插入图片描述这里看Region设置的本质来源还是system_server发起的,dumpsys input看到的Region是SurfaceFlinger直接传递的,有了上面的知识基础后,开始分析这个分屏Region设置问题。

分析思路1–从systemserver进程设置源头出发进行打印堆栈分析
具体可以使用InputWindowHandleWrapper的setTouchableRegion进行堆栈打印,既可以很方便的追到哪里设置的touch矛,但是正常使用InputWindowHandleWrapper的setTouchableRegion发现根本没发现有分屏相关区域的任何设置。
分屏情况下的打印setTouchableRegion,发现并没有在system_server层面进行设置
在这里插入图片描述

分析思路2-从SurfaceFlinger角度出发分析Region的设置
从SurfaceFlinger看看给InputDispatcher的Region是如何设置的,这个其实在前面sf,input课程都有讲解,这里就不进行这块源码分析,主要还是针对Region的获取部分分析。

在这里插入图片描述下面来看看buildWindowInfos方法

在这里插入图片描述

在fillInputInfo方法中主要看核心部分

WindowInfo Layer::fillInputInfo(const ui::Transform& displayTransform, bool displayIsSecure) {
//省略
//明显看到这个地方有对touchableRegion进行额外的设置,而不是直接用systemserver端设置的,估计就是这个地方对分屏的Region进行了重新设置auto cropLayer = mDrawingState.touchableRegionCrop.promote();if (info.replaceTouchableRegionWithCrop) {std::string str;const Rect bounds(cropLayer ? cropLayer->mScreenBounds : mScreenBounds);info.touchableRegion = Region(displayTransform.transform(bounds));} else if (cropLayer != nullptr) {std::string str;info.touchableRegion = info.touchableRegion.intersect(displayTransform.transform(Rect{cropLayer->mScreenBounds}));}

在fillInputInfo需要加入相关的打印来验证猜想
加入日志后代码如下,主要在 if (info.replaceTouchableRegionWithCrop)前面打印一个Region,在他逻辑后打印一个

    std::string str;info.touchableRegion.dump(str,"info.touchableRegion");ALOGE(" %s fillInputInfo info str %s ",getName().c_str(),str.c_str());auto cropLayer = mDrawingState.touchableRegionCrop.promote();if (info.replaceTouchableRegionWithCrop) {std::string str;const Rect bounds(cropLayer ? cropLayer->mScreenBounds : mScreenBounds);info.touchableRegion = Region(displayTransform.transform(bounds));info.touchableRegion.dump(str,"info.touchableRegion");ALOGE("111111111111 %s   fillInputInfo info str %s cropLayer %s",getName().c_str(),str.c_str(),cropLayer!=nullptr ? cropLayer->getName().c_str():"null");} else if (cropLayer != nullptr) {std::string str;info.touchableRegion = info.touchableRegion.intersect(displayTransform.transform(Rect{cropLayer->mScreenBounds}));info.touchableRegion.dump(str,"info.touchableRegion");ALOGE("22222222222222 %s  fillInputInfo info str %s ",getName().c_str(),str.c_str());}

然后进入分屏,查看日志结果如下

在这里插入图片描述
得到结论如下:
1、分屏的相关window设置的TouchRegion是开始就是0
2、因为replaceTouchableRegionWithCrop标志设置成了true,代表要使用task的bounds覆盖TouchRegion
3、具体使用哪个task的bounds需要靠mDrawingState.touchableRegionCrop这个参数

那么这个replaceTouchableRegionWithCrop和mDrawingState.touchableRegionCrop是哪里设置的呢?

设置堆栈如下:
在这里插入图片描述

void populateInputWindowHandle(final InputWindowHandleWrapper inputWindowHandle,final WindowState w) {//省略部分if (task != null) {// TODO(b/165794636): Remove the special case for freeform window once drag resizing is// handled by WM shell.//判断task是不是属于分屏if (task.isOrganized() && task.getWindowingMode() != WINDOWING_MODE_FULLSCREEN&& !task.inFreeformWindowingMode()) {// If the window is in a TaskManaged by a TaskOrganizer then most cropping will// be applied using the SurfaceControl hierarchy from the Organizer. This means// we need to make sure that these changes in crop are reflected in the input// windows, and so ensure this flag is set so that the input crop always reflects// the surface hierarchy.//分屏useSurfaceBoundsAsTouchRegion为trueuseSurfaceBoundsAsTouchRegion = true;if (w.mAttrs.isModal()) {//获取的Task,这个Task就是上面sf的touchableRegionCropTaskFragment parent = w.getTaskFragment();touchableRegionCrop = parent != null ? parent.getSurfaceControl() : null;}} else if (task.cropWindowsToRootTaskBounds() && !w.inFreeformWindowingMode()) {touchableRegionCrop = task.getRootTask().getSurfaceControl();}}inputWindowHandle.setReplaceTouchableRegionWithCrop(useSurfaceBoundsAsTouchRegion);inputWindowHandle.setTouchableRegionCrop(touchableRegionCrop);
//省略部分}

代码总结:
1、遍历windowstate的WindowMode是否属于非全屏非自由窗口,如果分屏模式,则需要设置setReplaceTouchableRegionWithCrop为true

2、遍历分屏窗口的父亲Task,把Task设置为TouchableRegionCrop,最后会设置到sf中

整体总结:

在framework系统是属于一个很复杂的体系,每个小分支都会有很多不同的处理方式等,所以当使用正规的思路打堆栈分析不出来时候,不应该直接放弃,更应该从逆向,或者多角度来尝试探索分析,这样才符合实际项目中遇到各种问题都可以使用学习的知识灵活应对,而不是仅仅套一下模板,一旦有一些异常变化就又不知道如何分析,教给各位粉丝的知识一定要活学活用哈,整体理解多角度分析。

更多framework实战干货,请关注下面“千里马学框架”

http://www.tj-hxxt.cn/news/41197.html

相关文章:

  • 广州办营业执照在哪里办理重庆网站seo服务
  • 做网站视频用哪个视频编辑软件文章优化软件
  • 做风水起名网站推广建站 seo课程
  • 哪做网站枸橼酸西地那非片的功效与作用
  • 大连企业自助建站云南今日头条新闻
  • 30分钟seo网站抖音搜索seo软件
  • 拖式网站建设免费开源代码网站
  • 手机网站制作费用关键词林俊杰百度云
  • 搜一搜站长工具软文网站
  • wordpress表单 post抖音seo关键词优化排名
  • 网站建设被骗维护费万网域名管理入口
  • 深圳网站建设外贸公司排名沈阳头条今日头条新闻最新消息
  • 版面设计排版南宁网站优化公司电话
  • 好的文案网站seo网站制作优化
  • 深圳专门做兼职的网站电商网页
  • 深圳找工作哪个网站好广告营销是做什么的
  • WordPress指定IP访问seo百度排名优化
  • 永清建设局网站2024年疫情还会封控吗
  • 除了wordpress信息流优化师前景
  • 网站备案 主体黑名单网页设计模板
  • 一个网站可以做多个描述吗武汉seo报价
  • 做外贸哪个英文网站好长春百度快速优化
  • 网站开发后端用什么关键词优化排名详细步骤
  • 做一个搜索引擎网站要多少钱seo外链论坛
  • 服装设计公司效果图怎么优化自己公司的网站
  • php网站后台密码忘记了成都百度推广开户公司
  • 建筑给排水代做网站全球网络营销公司排名
  • mac做网站软件佛山网站优化
  • 网站托管平台爱站网工具
  • 有什么网站可以做问卷调查网络营销外包推广定制公司