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

Android开发指南-用户界面-绘制视图

Android怎么绘画视图How Android Draws Views

当一个活动接收到焦点时,它将被要求绘制它的布局。Android框架将处理这个绘画的过程,但是活动必须提供它的布局层次的根节点。

绘画从布局的根节点开始。它被要求来测量和绘制布局树。绘画通过遍历布局树并渲染每个和失效区域相交的视图来处理。相应的,每个视图组负责请求绘制它的子视图(通过draw() 方法)而每个视图负责画它自己。因为这个树是顺序遍历的,这意味着先画父节点(也就是在屏幕后面),然后按照树中出现的顺序画其同层次节点。

框架将不会画不在失效区域的视图,而且还将会帮你画视图背景。

你可以强制一个视图被重画,通过调用invalidate()

绘画布局共有两步:一个度量过程和一个布局过程。度量过程在measure(int, int)里实现且是一个自顶向下的视图树遍历。每个视图在递归时往下推送尺寸规格。在度量过程的最后,每个视图都已经保存了自己的度量。第二个过程发生在layout(int, int, int, int) 中并且也是自顶向下。在这个过程中,每个父节点负责定位它的所有子节点,通过使用在度量过程中计算得到的尺寸。

当一个视图的measure()方法返回时,它的getMeasuredWidth()getMeasuredHeight() 值必须被设置,以及所有这个视图子节点的值。一个视图的度量的宽度和高度值必须符合父视图引入的限制。这确保在度量过程之后,所有父节点接受所有它们的子节点的度量值。一个父视图可能会在其子视图上多次调用measure()方法。比如,父视图可能会通过未指定的尺寸调用measure来发现它们的大小,然后使用实际数值再次调用measure(),如果所有子视图未做限制的尺寸总合过大或过小(也即是,如果子视图之间不能对各自占据的空间达成共识的话,父视图将会干预并设置第二个过程的规则)。

要开始一个布局,可调用requestLayout()。这个方法通常在视图认为它自己不再适合它当前的边界的情况下被调用。

度量过程使用两个类来交流尺寸。View.MeasureSpec类被视图用来告诉它们的父视图它们想如何被度量和定位。基础的LayoutParams类仅仅描述了视图想有多大(高和宽)。对于每个维度,它可以指定下面之一:

· 一个准确的数值

· FILL_PARENT, 这意味着视图想和父视图一样大(减掉填充padding)。

· WRAP_CONTENT, 这意味着视图只想有刚好包装其内容那么大(加上填充)

对于不同的ViewGroup子类,有相应的LayoutParams子类。比如,相对布局RelativeLayout有它自己的LayoutParams子类,这包含了能够让子视图横向和竖向居中显示的能力。

度量规格(MeasureSpecs)被用来沿着树从父到子的下传度量需求。一个MeasureSpecs可以是下面三种模式之一:

· UNSPECIFIED: 这被父视图用来决定其子视图期望的尺寸。比如,一个线性布局可能在它的子视图上调用measure() on its child,通过设置其高度为UNSPECIFIED 以及一个宽度为EXACTLY 240,来找出这个子视图在给定240像素宽度的情况下需要显示多高。

· EXACTLY: 这被父视图用来给子视图强加一个准确的尺寸。子视图必须使用这个大小,并确保其所有的后代将适合这个尺寸。

· AT_MOST: 这被父视图用来给子视图强加一个最大尺寸。子视图必须确保它自己以及所有的后代都适合这个尺寸。

相关文章:

  • 摆脱枯燥的文字描述——markdown表情包黑科技
  • 真正要寻找的是那些充满了热情,希望做出点成绩来的人
  • UVa11134 Fabled Rooks(贪心)
  • 给各位支持我的朋友的致歉信
  • 计算几何——极角排序
  • 不同差异程度商品的电子商务策略
  • UVa1606 Amphiphilic Carbon Molecules(极角排序+扫描线)
  • 滴水之光 折射太阳
  • POJ3061 Subsequence(尺取法)
  • UVa11572 Unique Snowflakes(尺取法)
  • 对MM平台的一些思考
  • 2019 ICPC Asia Taipei - Hsinchu Regional
  • Android游戏的盈利模式探讨
  • POJ 2566 Bound Found(尺取法+前缀和)
  • Call 从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。
  • 【mysql】环境安装、服务启动、密码设置
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • Facebook AccountKit 接入的坑点
  • JavaScript HTML DOM
  • OSS Web直传 (文件图片)
  • Python实现BT种子转化为磁力链接【实战】
  • python学习笔记-类对象的信息
  • Rancher如何对接Ceph-RBD块存储
  • tensorflow学习笔记3——MNIST应用篇
  • Windows Containers 大冒险: 容器网络
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 服务器之间,相同帐号,实现免密钥登录
  • 老板让我十分钟上手nx-admin
  • 聊聊redis的数据结构的应用
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 三栏布局总结
  • 我有几个粽子,和一个故事
  • 无服务器化是企业 IT 架构的未来吗?
  • 详解NodeJs流之一
  • 用简单代码看卷积组块发展
  • 原生js练习题---第五课
  • scrapy中间件源码分析及常用中间件大全
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • UI设计初学者应该如何入门?
  • ​油烟净化器电源安全,保障健康餐饮生活
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (+4)2.2UML建模图
  • (12)目标检测_SSD基于pytorch搭建代码
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (分类)KNN算法- 参数调优
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (六)Hibernate的二级缓存
  • (四)汇编语言——简单程序
  • (一) storm的集群安装与配置
  • (转)JAVA中的堆栈
  • ..回顾17,展望18
  • .NET 使用 XPath 来读写 XML 文件
  • .NET是什么
  • :not(:first-child)和:not(:last-child)的用法