PinnedListView分析二
在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分析二的更多相关文章
- SNMP报文抓取与分析(二)
SNMP报文抓取与分析(二) SNMP报文抓取与分析(二) 1.SNMP报文表示简介 基本编码规则BER 标识域Tag表示 长度域length表示 2.SNMP报文详细分析(以一个get-respon ...
- Fresco 源码分析(二) Fresco客户端与服务端交互(1) 解决遗留的Q1问题
4.2 Fresco客户端与服务端的交互(一) 解决Q1问题 从这篇博客开始,我们开始讨论客户端与服务端是如何交互的,这个交互的入口,我们从Q1问题入手(博客按照这样的问题入手,是因为当时我也是从这里 ...
- yhd日志分析(二)
yhd日志分析(二) 继续yhd日志分析,统计数据 日期 uv pv 登录人数 游客人数 平均访问时长 二跳率 独立ip数 1 分析 登录人数 count(distinct endUserId) 游客 ...
- SQLite入门与分析(二)---设计与概念(续)
SQLite入门与分析(二)---设计与概念(续) 写在前面:本节讨论事务,事务是DBMS最核心的技术之一.在计算机科学史上,有三位科学家因在数据库领域的成就而获ACM图灵奖,而其中之一Jim G ...
- Linux内核启动代码分析二之开发板相关驱动程序加载分析
Linux内核启动代码分析二之开发板相关驱动程序加载分析 1 从linux开始启动的函数start_kernel开始分析,该函数位于linux-2.6.22/init/main.c start_ke ...
- 一些有用的javascript实例分析(二)
原文:一些有用的javascript实例分析(二) 5 求出数组中所有数字的和 window.onload = function () { var oBtn = document.getElement ...
- Android4.0图库Gallery2代码分析(二) 数据管理和数据加载
Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 2012-09-07 11:19 8152人阅读 评论(12) 收藏 举报 代码分析android相册优化工作 Androi ...
- MapReduce深度分析(二)
MapReduce深度分析(二) 五.JobTracker分析 JobTracker是hadoop的重要的后台守护进程之一,主要的功能是管理任务调度.管理TaskTracker.监控作业执行.运行作业 ...
- Java线程池使用和分析(二) - execute()原理
相关文章目录: Java线程池使用和分析(一) Java线程池使用和分析(二) - execute()原理 execute()是 java.util.concurrent.Executor接口中唯一的 ...
随机推荐
- PowerShell控制台字体设置
1.打开注册表: HKEY_CURRENT_USER\Console\%SystemRoot%_System32_WindowsPowerShell_v1.0_powershell.exe 2.找到键 ...
- PureFtpd 连接数据库错误
用Ubuntu一段时间了,作为服务器真是好用,还轻快的很. 作为服务器怎么能没有ftp呢,这里用了pureftpd,没有用vsftpd是因为听大牛说听麻烦,没用过没发言权,不过pureftpd真的挺好 ...
- keepAlive参数详解
最近研究netty5.0中 发现http例子里面有关于KeepAlive的处理,于是研究了下 http://www.nowamagic.net/academy/detail/23350305
- .net4.5使用async和await异步编程实例
关于异步编程的简单理解: 在.NET4.5中新增了异步编程的新特性async和await,使得异步编程更为简单.通过特性可以将这项复杂的工作交给编译器来完成了.之前传统的方式来实现异步编程较为复杂,这 ...
- 绕过chrome的弹窗拦截机制
在chrome的安全机制里面,非用户触发的window.open方法,是会被拦截的.举个例子: var btn = $('#btn'); btn.click(function () { //不会被拦截 ...
- JAVA线程池任务数大小设置
线程池究竟设成多大是要看你给线程池处理什么样的任务,任务类型不同,线程池大小的设置方式也是不同的. 任务一般可分为:CPU密集型.IO密集型.混合型,对于不同类型的任务需要分配不同大小的线程池. CP ...
- 【ARM】ARM体系结构-GPIO
GPIO Gerneral-Purpose IO ports,即通用IO口. 在嵌入式系统中常常有数量众多,但是却比较简单的外部设备/电路. 对这些设备/电路,有的需要CPU为之提供控制手段,有 ...
- 删除mysql备份文件
前言:前篇介绍了mysql的备份方法,但备份不是越多越好,如果磁盘空间不够用,我需要保留近一个周的备份就可以了,那就需要删除备份脚本了,特别注意删除操作比较危险,变量传参要进行二次确认. 下面给出删除 ...
- 好用的vim插件
# 好用的vim插件 ### 简介------------------------------ 记录vim好用的插件 ### vimcdoc vim中文帮助文档-------------------- ...
- Android SDK下载和更新失败解决方法
原因是dl-ssl.google.com访问不到,解决方法就是修改C:\Windows\System32\drivers\etc\hosts文件.添加一行: 74.125.237.1 dl ...