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解析的方式将其实例化
的原理,所以只有扎实的掌握这些计算机编程基础,在开发和学习新技术或陌生领域才能有法可循甚至得心应手。
对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解析的方式将其实例化
的原理,所以只有扎实的掌握这些计算机编程基础,在开发和学习新技术或陌生领域才能有法可循甚至得心应手。
相关文章推荐
- android ndk 开发
- Android四大组件之BroadcastReceiver详细解析
- android启动过程之init.rc文件浅析
- RecyclerView分割线之RecyclerView.ItemDecoration的理解(笔记)
- Android签名总结
- Android : DevicePolicyManager
- Android Activity生命周期及启动模式详解
- 关于Android的Dialog
- Android的原子操作函数
- Android蓝牙编程 之 同时打开SPP和音频A2DP服务
- Android-onInterceptTouchEvent()和onTouchEvent()总结
- Android学习笔记开篇
- 提高工作效率的16条Android开发小经验
- Android SearchView搜索框组件的使用方法
- 一个介绍android 的log的一些进一步封装与快捷操作的文章
- (4.1.20.2)Android 5.0 可以给一个 View 单独设置一个 theme
- Android性能优化
- Android常用英文词汇
- Android 快速开发框架:推荐10个框架:afinal、ThinkAndroid、andBase、KJFrameForAndroid、SmartAndroid、dhroid..
- 【Android】24、如何随时随地退出程序