Android自定义View知识体系

通过看技术博客查资料动手写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解析的方式将其实例化

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

























                         




























                               


































                         




























                               









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值