Android 控件架构与自定义控件详解

Android 控件架构

控件架构.png
  • 每个 Activity 都包含一个 Window 对象,Window 对象由 PhoneWindow 实现
  • PhoneWindow 将一个 DecorView 设置为这个应用的根 View
  • DecorView 作为窗口界面的顶级视图,封装了一些窗口操作的通用方法

所有的 View 监听的事件,都通过 WindowManagerService 来进行接收

  • TitleView
  • ContetnView 也就是 setContentView() 里面的视图

这里的控件架构解释了 requestWindowFeature()为何要在 setContentView() 方法之前才可以生成的原因

在代码上,当程序中 调用 setContentView()ActivityManagerService 会回调 onResumen() 方法,此时系统把整个 DecorView 添加到 PhoneWindow 中,并让其显示出来,从而完成界面的绘制

View 的测量

MeasureSpec 类 ,Spec 规范
MeasureSpec :一个 32 位的 int 值

  • 高 2 位 为测量的模式
  • 低 30 位为测量的大小

使用位运算的原因:提高并优化效率

测量的模式:

EXACTLY(Default) AT_MOST UNSPECIFIED
match_parent or 精确值 wrap_content 想多大就多大

onMeasue() 默认仅支持 EXACTLY 模式,要让自定义 View 支持 AT_MOST 模式,就必须重载 onMeasue() 方法

View 的绘制

重载方法 onDraw(Canvas canvas) 方法中有一个可以操纵的 画布对象 canvas ,而实际上当需要 new 一个 canvas 时,需要传入一个 bitmap 的对象
bitmap 对象 与 canvas 对象上关联的,

bitmap 对象用来存储所有绘制在 canvas 上的像素信息。
所以操作 canvas 对象,可以理解为 canvas 对象对 bitmap 对象进行操纵。

ViewGroup 的测量

ViewGroup 可以存放 ViewGroup 和 View,竟然可以存放这些对象,就需要对这些对象进行负责,包括子View的显示大小:

  • onMeasure() 当 ViewGroup 的大小为 wrap_content(AT_MOST 模式)时,ViewGroup 便需要的子 View 进行遍历,以获取所有子 View 的大小,从而来决定自己的大小
  • onLayout()当 子View 测量完后,需要将子 View 放到合适的位置,,这个过程就是 View 的Layout 过程,这里同样需要进行遍历。ViewGroup 在执行 Layout 过程中,同样上使用遍历来调用子 View 的 Layout 方法,并指定其具体显示的位置,从而来决定其布局位置

ViewGroup 的绘制

通常并不需要绘制

  • onDraw() 指定 ViewGroup 的背景颜色时才被调用
  • dispatch() 绘制 ViewGroup 的子 View

自定义 View

重要的回调方法:

  • onMeasure():进行测量
  • onLayout():确定显示的位置
  • onTouchEvent():监听触摸事件的回调
  • onFinishInflate():从 XML加载组件后回调
  • onSizeChanged():组件改变大小时回调

扩展原有控件

  1. 定义属性 attrs.xml
<declare-styleable name="customer_name">
  <attr name = "attr_name" format="reference|dimension"/>

</declare-styleable>

2.java

TypeArray ta  =context.obtainStyleAttributes(attrs,R.styleable.customer_name);
ta.rececle() //资源回收

创建复合控件

待续。。。

继承 View

待续。。

自定义 ViewGroup

  • onMeasure():对子 View 进行测量
  • onLayout():确定子 View 的位置
  • onTouchEvent():增加响应事件
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容