您的位置:首页 > 移动开发 > Android开发

Android自定义View知识体系

2016-05-25 17:07 218 查看
通过看技术博客查资料动手写Demo

对android自定义View的学习进行总结(仅记录主题思想结构)

(其中源码部分只记录主要实现思想)

View是android系统平台负责UI显示交互的主要类

通过学习他人技术博客和查阅文档android自定义的知识可以分为一下几类

一、View相关知识

二、View和ViewGroup简明关系

三、Android中的事件分发机制

具体知识脉络如下:

一、View相关知识

1.LayoutInflater

俗称打气筒 通过LayoutInflate类的view inflate(resourceID,root )方法,将XML布局文件实例化

其中主要两个参数 resourceID是布局XML文件的ID

root 是外层嵌套的父布局

可以通过两种方法获得LayoutInflater实例:

LayoutInflate.from(context);

(LayoutInflater)Context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

源码分析:

inflater底层源码的主要思想就是读取所要实例化的布局XML文件,然后进行pull解析然后实例化出View对象

2.View的大体绘制步骤

(1)onMeasure()

主要完成view的测量计算

涉及的主要参数:

widthMeasureSpec (宽度量测)

heightMeasureSpec (高度量测) 其中又分为:SpecSize (准确大小)

SpecMode (规格)分三种 EXACTLY

AT_MOST

UNSPECIFIED

(2)onLayout()

主要完成将view布局到适当位置

主要方法就是layout(左,上,右,下);

左 和 上 是控件左边缘和上边缘相对于父类控件左边缘和上边缘的距离

右 和 下 是空间右边缘和下边缘相对于父类控件左边缘和上边缘的距离



(3)onDraw()

主要负责view的绘制

主要思想就是就是通过Canvas,Paint完成view的绘制过程

底层是调用surface进行openGL完成绘制过程

android中所有控件都是进过以上三个方法严格计算测量绘制成的

3.视图状态

要想深入了解View的实现原理已经自定义View的实现要了解View中试图状态的定义

主要视图状态:enabled focused windows_focused selected pressed

主要方法包括:setVisibility( ) setEnabled ( ) setSelected( )

以上方法想要改变view视图状态都直接或间接的实现了 invalidate() 或 invalidateDrawable()方法实现View的重绘

4.自定义View实现

主要分成三种类型

自绘控件

主要思想是继承View,重写onDraw()方法 利用Canvas 和 Paint 对于控件进行自定义的绘制

主要用于需要特殊模式自定义样式的View

组合控件

主要思想是利用已有控件,重新组合成一个新的View统一管理各个子控件的状态和方法

主要用于将多个已有控件的特性进行组合完成,实现一个综合特性的新View

继承控件

主要思想是利用Android中原生存在的控件,继承后重写其中的属性和方法

主要应用于将Android中原生存在的控件增加定制的新功能的方法

具体实现Demo:

二、View和ViewGroup关系

大体思想就是 ViewGroup是View的子类 一个ViewGroup中可以包含多个View

底层: surface->openGL渲染

系统服务层:WindowManagerImpl中包含一个ViewRoot

应用层: Activity中attach依附于PhoneWindow,PhoneWindow中包含了Decor View ,Decor View 中承载了View和ViewGroup

三、Android事件分发机制

指的是Android应用程序与用户交互时,触发一定事件,系统捕获这些事件然后进行分配给各个控件进行处理

主要思想:

当控件被点击时会执行View类中的dispatchTouchEvent( )方法 在此方法中队事件进行分发

View事件分发方式:

底层源码:

在dispatchTouchEvent( )只能够会做三个判断条件(其中包括onTouch()方法)) 符合条件(true)的直接返回true

不符合条件(false) 的返回onTouchEvent()方法 其中调用performClick( ) 根据条件执行 onClick( )方法

总结是:

dispatchTouchEvent()-> onTouch() ->条件判断 true 干掉事件 不再传递

条件判断 false 向下传递分发事件Event ->onTouchEvent() ->onClick();

也就是是说事件分发从onTouch()开始处理 然后 再传给 onTouchEvent()再给 onClick( )处理

ViewGroup事件分发方式:

底层源码:

系统捕获事件,通过ViewGroup的dispatchTouchEvent( )方法进行分发其中调用onInterceptTouchEvent( )方法中条件判断

符合条件(true)的直接返回true 拦截子View的事件 调用super.dispatchTouchEvent( ) 执行ViewGroup的onTouch( )方法

不符合条件(false) 的直接返回false for循环边里子View 将事件分发给子View进行处理 子View的事件处理方法被执行

总结是:

控件层同上都是onTouch( ) 到 onTouchEvent( ) 到 onClick( )

布局层事件传递顺序层是 ViewGroup根据dispatchTouchEvent( )对事件进行分发 —>onInterceptTouchEvent( )根据条件 —>要么拦截事件 要么循环遍历给子View由子View处理事件



以上便是关于View的主要知识体系,通过学习实践不断进行补充和完善,其中通过掌握以上知识后,android中自定义View的实现应该是一件容易的事情了,相信只需不断实践和积累就可以掌握

还有关于看此部分Android底层源码的收获就是例如View的绘制,底层无非就是采用递归或循环的方式遍历所有要素,然后执行方法即可 再如xml布局的实例也是主要通过pull解析的方式将其实例化

的原理,所以只有扎实的掌握这些计算机编程基础,在开发和学习新技术或陌生领域才能有法可循甚至得心应手。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: