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

2016-04-07  本文已影响37人  LittleHans

Android 控件架构

控件架构.png

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

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

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

View 的测量

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

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

测量的模式:

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的显示大小:

ViewGroup 的绘制

通常并不需要绘制

自定义 View

重要的回调方法:

扩展原有控件

  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

上一篇下一篇

猜你喜欢

热点阅读