布局的测量

布局的测量

日记

这次随便写写什么日常呢?哦哦,谢谢我曾经的一个梦吧,2022年7月,人们终于实现了完全潜行技术,通过这个技术,推出了人类历史上首个完全潜行游戏《Sword Art Online》!

没错,刀剑神域,曾经在我少年的时候,这部动漫给了我一个梦,在2008年给我一个梦,幻想着2022年,能如愿玩到这么一个游戏,邂逅像Asuna那样的女孩。可惜,前段时间约以前的几个同学去看刀剑神域进击篇的时候,看到动漫2022年的背景时间设定的时候,要说我心里没有一丝隐隐然的哀伤,那绝对是我在说谎。

真没想到,10年过去了,随着乔布斯的离世,世界好像停止运转了一样。真没有感觉到世界有什么明显的进步。有的只是美国研发出新的病毒,有的只是美国在乌克兰挑起了新的战争,有的只是经济的倒退,所有人的就业局势越来越差。有个姓罗的胖子沾沾自喜地在十年以前预测,未来会非常美好,并且可能会远远超出我们的想象,不知道那个胖子现在会如何看待以前的自己。他说过,看罗辑思维的人,智商没有低的,这个话要这么理解。看罗辑思维的人分为两种,第一种,是真正智商高的,他希望学习这样一套洗脑的方式;另外一种就是自认为智商高的,这类人自认为掌握了不同于别人的智慧,有种众人皆醉我独醒的超然(呵)。

好了,废话好像的确说的有点多了,我们来看看今天的主题吧。

前言

视图相关的内容主要分为三块:

  1. 测量
  2. 绘制
  3. 触摸反馈。

今天我就主要来讲讲测量相关的内容。计算机相关的很多知识点似乎都很喜欢用父子关系和结构来进行定义,可能因为父子关系比较通俗易懂吧。

布局的测量的意思就是如何根据XML文件中的布局定义关系,来获取到实际视图树每个子视图所在的位置和大小,这样一来,子视图就能够根据位置和大小来在给定的位置上来绘制自己所需要的效果。

视图按照其职责可以分为两类:ViewGroup和View。ViewGroup主要负责为其中包含的子视图分配绘制区域,我们非常熟悉的线性布局LinearLayout,相对布局RelativeLayout以及限制布局ConstraintLayout都是分属于ViewGroup。而View的主要作用则更多是用来进行绘制的比如说我们日常中的TextView和EditText。但是一切东西都是应该按照我们的需要来定,因为我们可以看到ViewGroup其实继承自View,也就是说,ViewGroup能做到的事情,其实View完全都能做到,实际开发的时候,有些时候还是要学会变通。

另外在这里我额外吐槽一点,我怕我后面写着写着就忘了吐槽了,最近在项目里面动不动就看见ConstraintLayout设计的布局,这个我没有意见,因为这个布局本身非常的灵活,基本能满足我们日常开发中对于自定义布局的所有要求。但是,你也不能说为了使用这个而使用这个布局,那种非常非常简单的线性定义的,用LinearLayout完全就行了,根本没有必要去特别去用ConstraintLayout去骚操作,特别有些童鞋对于这个布局还掌握不熟练,然后很简单的一个布局用LinearLayout十几行就能搞定了,用ConstraintLayout要用三倍的代码行数,这不是傻吗?好了,吐槽结束,我们继续来谈谈视图的绘制。

来看看绘制的四个主要方法:父视图onMeasure()->子视图measure()->父视图onLayout()->子视图layout()。我们就拿一个非常常见的一个问题来讨论讨论如上的测量流程:为什么不建议太多层级的嵌套,为什么说一旦嵌套过多会影响性能。

首先,个人认为,如果要是有本事所有布局尺寸都是用绝对数据来设置,那么我认为其实嵌套多层其实对于性能也不会有太大的影响。最大的问题是:Android页面布局存在wrap_content,match_parent,weight这些能自适应的好参数。就是因为这些参数的存在,我们的视图树就不能单纯通过一次遍历来给所有子视图配置对应的视图绘制位置和尺寸。

我们就拿LinearLayout举例,因为这个布局实在太过于经典了。

首先,视图布局分配是有一定优先级次序的,分配的优先级从高到低依次是:指定固定值(match_parent其实就是让子视图的尺寸和父视图一致),weight。

weight是什么呢?被指定weight的视图就非常悲催了,match_parent和固定值的方式都能至少保证自己能够获取到对应的视图大小,但是weight只能在分空间剩下的区域里面去按照weight进行进一步分配。

猜你喜欢

转载自blog.csdn.net/qq_31433709/article/details/131263017