PinnedListView分析一中还有一些细节在本文做一个补充,主要是view的绘制;

一个view在真正被绘制都是通过canvas来做,在ViewGroup内的z子view,一般再次此之前,还需要通过measuring和layout操作来确定绘制之前的大小位置,measuring是来确定view需要显示的确切大小,浏览源码时经常会看到和height、width一起出现的mode,分别是:

  • {@link android.view.View.MeasureSpec#UNSPECIFIED}
  • {@link android.view.View.MeasureSpec#EXACTLY}
  • {@link android.view.View.MeasureSpec#AT_MOST}

根据对原注释的翻译

UNSPECIFIED,表示承载该view的父view没有为该view设置任何明确地大小约束,所以该view的大小可以是需求的任意大小;

EXACTLY,表示父view已经确定该view应该显示的大小,此时将忽略view本身要求的大小

AT_MOST,表示该view有一个上限,大小可以是低于上限的任意值。

为什么要先讲mode,那是因为确定view的大小需要先进行measuring操作,这是就需要传入分别对应于height、width的mode值,

然后紧接着第二部就是layout,传入view要显示的位置和大小,一般来说可以理解为左上角二位坐标点和右下角二位坐标点的四个数值

完成了layout操作的两部之后就可以在合适的地方绘制到界面中,这里选择的是dispatchDraw()方法,dispatch可以理解为分发、调度,放在ViewGroup中就是在绘制子view之前会调用,是个抽象方法,ListView和AbsListView已经分别实现了一次,在这里我的要绘制的顶部固定的view已经说过他不在整个ViewGroup的树状结构内,所以我们先调用super.dispatcheDraw(),把正常的子view绘制走完,然后通过canvas绘制我们需要的子view,先调用save来保存当前matrix等信息到栈内方便待会恢复,因为我们这里会操作并改变canvas的数据,但是之后我们需要把它重置回去,由于我们的current header view并不是简单钉在顶部,当下面的section view划上来时要能继续往上,有被替换的效果,所以这里有一个位移操作,canvas.translate(0, mHeaderOffset),后面还有一步clipRect的操作,目前不是很理解具体是干啥,他是一个native的方法,后面就是draw和restore了。

PinnedListView分析二的更多相关文章

  1. SNMP报文抓取与分析(二)

    SNMP报文抓取与分析(二) SNMP报文抓取与分析(二) 1.SNMP报文表示简介 基本编码规则BER 标识域Tag表示 长度域length表示 2.SNMP报文详细分析(以一个get-respon ...

  2. Fresco 源码分析(二) Fresco客户端与服务端交互(1) 解决遗留的Q1问题

    4.2 Fresco客户端与服务端的交互(一) 解决Q1问题 从这篇博客开始,我们开始讨论客户端与服务端是如何交互的,这个交互的入口,我们从Q1问题入手(博客按照这样的问题入手,是因为当时我也是从这里 ...

  3. yhd日志分析(二)

    yhd日志分析(二) 继续yhd日志分析,统计数据 日期 uv pv 登录人数 游客人数 平均访问时长 二跳率 独立ip数 1 分析 登录人数 count(distinct endUserId) 游客 ...

  4. SQLite入门与分析(二)---设计与概念(续)

    SQLite入门与分析(二)---设计与概念(续)   写在前面:本节讨论事务,事务是DBMS最核心的技术之一.在计算机科学史上,有三位科学家因在数据库领域的成就而获ACM图灵奖,而其中之一Jim G ...

  5. Linux内核启动代码分析二之开发板相关驱动程序加载分析

    Linux内核启动代码分析二之开发板相关驱动程序加载分析 1 从linux开始启动的函数start_kernel开始分析,该函数位于linux-2.6.22/init/main.c  start_ke ...

  6. 一些有用的javascript实例分析(二)

    原文:一些有用的javascript实例分析(二) 5 求出数组中所有数字的和 window.onload = function () { var oBtn = document.getElement ...

  7. Android4.0图库Gallery2代码分析(二) 数据管理和数据加载

    Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 2012-09-07 11:19 8152人阅读 评论(12) 收藏 举报 代码分析android相册优化工作 Androi ...

  8. MapReduce深度分析(二)

    MapReduce深度分析(二) 五.JobTracker分析 JobTracker是hadoop的重要的后台守护进程之一,主要的功能是管理任务调度.管理TaskTracker.监控作业执行.运行作业 ...

  9. Java线程池使用和分析(二) - execute()原理

    相关文章目录: Java线程池使用和分析(一) Java线程池使用和分析(二) - execute()原理 execute()是 java.util.concurrent.Executor接口中唯一的 ...

随机推荐

  1. 【Unity】4.1 创建组件

    分类:Unity.C#.VS2015 创建日期:2016-04-05 一.简介 组件(Component)在Unity游戏开发工作中非常重要,可以说是实现一切功能所必需的. 1.游戏对象(Game O ...

  2. Java虚拟机(JVM)概述

    JVM(Java虚拟机)是一个抽象的计算模型.就如同一台真实的机器,它有自己的指令集和执行引擎,可以在运行时操控内存区域.目的是为构建在其上运行的应用程序提供一个运行环境.JVM可以解读指令代码并与底 ...

  3. Python2.7 fabric理论学习

    在python中有一个可以实现批量管理服务器的工具:fabric,在本地和远程机器上提供了一些基本的操作,并且可以上传/下载文件.执行sudo等功能. 学习环境:ubuntu 12.10+python ...

  4. linux如何查看一个进程的堆栈

    转自:http://blog.csdn.net/nanjingligong/article/details/8624739 方法一:pstack pidNAME       pstack - prin ...

  5. 19、UWP 新特性(Creator Update)

    Build 版本 15063+ 1.能够为 CompositionObjects 的其他属性(阴影,裁剪,属性集合)添加动画 2.当设备插上电源的时候,通过 Extended Excution Ses ...

  6. 【转】(六)unity4.6Ugui中文教程文档-------概要-UGUI Animation Integration

    原创至上,移步请戳:(六)unity4.6Ugui中文教程文档-------概要-UGUI Animation Integration 5.Animation Integration(动画集成) 动画 ...

  7. IntelliJ IDEA中的properties文件乱码转成中文[unicode码转中文]

    在IntelliJ IDEA中,一些.properties后缀的配置文件中的中文常常会是下面的样子,看不懂怎么办? 解决办法:File-->Settings-->File Encoding ...

  8. AAPT err(Facade for): libpng error: Not a PNG file 错误解决

    在导入项目到Android studio后,若编译出现“AAPT err(Facade for): libpng error: Not a PNG file”错误. 该错误表示项目中的drawable ...

  9. 软链接ln -s以及如何解决其产生“Too many levels of symbolic links ”的错误?

    Q1:如何利用ln -s来创建快捷方式? A1:ln(link,链接文件): Windows中的快捷方式,实际上快捷方式和它指向的文件是独立的两个文件,两个都占硬盘空间,只不过用户访问快捷方式时,其效 ...

  10. 2. 决策树(Decision Tree)-ID3、C4.5、CART比较

    1. 决策树(Decision Tree)-决策树原理 2. 决策树(Decision Tree)-ID3.C4.5.CART比较 1. 前言 上文决策树(Decision Tree)1-决策树原理介 ...