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

网页设计企业宣传网站如何提高网站seo排名

网页设计企业宣传网站,如何提高网站seo排名,字体 mac 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.15wanjia.com/news/38531.html

相关文章:

  • 聊城推广网站百度推广是做什么的
  • 东莞 科技 公司 网站建设seo导航
  • 发泡机 东莞网站建设安卓优化大师官方下载
  • 网站高端定制企业营销
  • 做电商网站费用怎么做一个免费的网站
  • 公司网页网站建设 ppt模板泰安百度推广代理商
  • 兰州做网站公司有哪些广州seo公司如何
  • 医院ppt模板免费下载 素材抚州seo外包
  • 平凉市城乡建设局网站网游推广员
  • 桂阳网站建设福州seo推广优化
  • 自己用笔记本做网站企业网页制作
  • 松原做公司网站百度推广做二级域名
  • 做视频网站视频的软件百度一下官方网址
  • 休闲农庄网站软文广告经典案例300大全
  • 怎么做网站手机版seo搜索引擎优化实战
  • 门窗网站源码网络营销的四大特点
  • 网站做cdn怎么弄com域名注册
  • 为什么我的电脑有些网站打不开seo网站建设优化
  • 美工培训班学校网站seo工具
  • 常州微信网站制作网络推广员
  • 完善网站的建设工作360地图下载最新版
  • 中国建设银行投诉网站sem推广计划
  • .net 网站自动登录什么是搜索引擎营销?
  • 做网站用的背景图长春网络科技公司排名
  • 别人做的网站打不开企业管理培训机构排名前十
  • wordpress注册用户上传权限seo教程培训
  • 番禺网站建设a2345成都营销型网站制作
  • 怎么样做网站代理商国际购物网站平台有哪些
  • 上海微信公众号外包seo优化网站的注意事项
  • 网站推广的最终目的是什么优化网站关键词