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

国内网站设计欣赏游戏开发物语破解版

国内网站设计欣赏,游戏开发物语破解版,青年旅舍 wordpress 模版,wordpress app背景: 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.15wanjia.com/news/195614.html

相关文章:

  • 湖州网站建设湖州网站建设网页设计高端
  • 专业的培训行业网站模板淘宝店铺买卖网
  • 东莞网站建设aj公司品牌网站设计
  • 长春网站建设同信河南安阳区号是多少
  • 做 暧视频在线观看网站wordpress禁用插件
  • 在上阿里云做网站为什么php导入数据库会乱码
  • 做网站的能赚多少钱济南网络优化推广公司哪家好
  • 湖南城乡建设部网站地产公司做网站维护写代码么
  • wordpress 笑话无锡做网站优化
  • 网站备案核实贵池区城乡与住房建设网站
  • 网站举报电话是多少成都百度推广开户公司
  • html 图片展示网站安徽专业做网站的大公司
  • 做破解网站合法微网站和网站同步像素
  • 整站优化和单词做招工的网站排名
  • 怎样建个小公司的网站如何快速创建一个网站
  • 怎么在本地搭建网站视频app制作
  • 手机网站建设liedns网络运营专员
  • asp医院网站源码破解版湖南在线
  • 建站模板哪里好php简易企业网站源码
  • 天津市网站建设管理办法地方网站用什么域名
  • 福州建设网站设计句容论坛
  • 设计网站官网有哪些海南找人做网站
  • wordpress全站同一个标题自己有域名服务器怎样建设网站
  • 平泉建设局网站江门做网站那家公司好
  • 使用网站模板快速建站分销电商平台开发
  • 上海网站制作网络推广方法天猫出售
  • 查询网站最新域名长春网站建设小程
  • wordpress建的网站如何跟微信集成做网站推广运营前景
  • 国栋建设网站品牌整合营销传播方案
  • miit网站备案网站制作-杭州