自定义控件那些事儿 ----- 二

来源:互联网 发布:安装 SQL 2014 编辑:程序博客网 时间:2024/05/16 23:33

一、引述

上一篇自定义控件那些事儿 ----- 一 说明了自定义控件实现的五个步骤:

(1)View属性的初始化;

(2)View位置大小的量测 ,主要在onMeasure()中实现;

【(3)View内部的布局关系展示,主要在onLayout()中实现;】

(4)View的绘制,即是最后的展示效果;

【(5)View交互事件的处理,实现View与目标对象的沟通。】


并且上一篇文章中,应用必要的环节完成一个简单的自定义控件,熟悉整个流程。同时也弄清楚,自定义控件实现中,主要大的框架实现有以下五部分:

(1)自定义控件的属性设置及对应值的获取;

(2)onMeasure()的实现;

(3)onLayout()的实现;

(4)onDraw()的实现;

(5)交互事件的实现,onTouchEvent()、以及ClickListener等监听器的处理。


没有很好的系统规划,进入职业疲乏期一样,除了保持基本的工作,保持基本的学习进度。最近的一年多并没有给自己增加较大的压力。所幸一切都还在基本的往前推进,自定义控件 ----- 属性与组合控件 都详细介绍了属性的设置值类型及获取值的方式。因此,第一部分也就算已经往前推进了。【若是有交流沟通与优化建议,希望听到大家的声音】


推荐一篇博客,Android应用层View绘制流程及源码分析,详细的分析拆解了基于源码分析的View绘制绘制流程。也是基于这篇博客,我做一下阅读笔记,并理解形成自己对于自定义控件的理解记忆。


二、主体框架

如文章描述,一个Activity页面的页面展示如图所示:


ContentView和TitleActionBar共同构成了一个Activity的整体布局。所以,必须先设置是否无Title模式,再设置ContentView才能够实现自定义头部布局的样式。已经设置ContentView后也就设置了TitleActionBar的显示模式。


1、Measure过程


依据博文,了解整个量测过程。在博客中说明比较清晰,我才用实际的例子再来拆解理解一下。

在View展示的最后模式中,View中主要用于展示一张图片,或者显示一些文字,加上实际内容(图片/文字)与其他控件之间的间距,从而形成整个展示效果。


如图,一个手机屏幕内展示一个View A 和一张图片,View A需要包含图片在内部。


手机屏幕的根View肯定是match_parent的,也就相当于根View的宽高等同于屏幕的宽高。

View量测模式有以下三种:

MeasureSpec.EXACTLY //确定模式,父View希望子View的大小是确定的,由specSize决定;MeasureSpec.AT_MOST //最多模式,父View希望子View的大小最多是specSize指定的值;MeasureSpec.UNSPECIFIED //未指定模式,父View完全依据子View的设计值来决定; 
对于指定View宽高也就相当于:固定大小,match_parent,wrap_content。

在实际的填充内容中,最终包裹的有效内容是图片或者文字,都会设置一定的大小。图片有图片的原始大小,文字有设置文字大小、间距、长度等,这些间接的设置了包裹文字的view的初始化大小。

如图所示,仅是View A和一张图片,有以下展示效果:



(1)View A设置包裹内容的时候,最后展示的效果,图片浮与View A的表面,两个一样大小。

(2)View A设置宽填充父窗体的时候,如图中间所示,能够显示相对大小关系;

(3)View A设置固定大小时,在固定大小大于图片大小时,和包裹内容相似;在固定大小小于图片大小时,图片会被缩小显示。这时候会取决于图片的缩放模式,从而显示不同的内容。


综上描述,整个量测过程确定了每个View的大小。


2、Layout过程


如博客所描述,以上图片是整个View的布局过程。

经过Measure过程,已经确定了每个View的大小,但即使是已经量测大小的View A 和 图片,他们最终展示的效果依旧有很多的变化。


如图:

(1)包裹内容下,View A和图片的大小已经确认,而二者的结合体在根View的展示位置却并未唯一标识下来。通过Layout布局,就可以确定是上图顶部的左还是右。

(2)在match_parent的模式下,View A的位置已经固定,但图片在View A中的位置却并未唯一。同样可以有左右的样式甚至更多。


通过整个Layout过程,就能够将每个View的位置唯一固定下来。


3,Draw过程


经过以上两步,每个View的大小、位置均固定下来。没有绘制,不展示出来,还依旧没什么用!通过整个绘制流程将所有内容展示出来。


在开发者选项中打开过度绘制,会发现每个view都绘制完善了,所以在view的叠合部分,绘制了很多次。因此,合适的布局及较少的布局叠加层次也是很重要的。



三、后续规划

通过以上的内容,对整个view的绘制流程有了较为清晰地认识。但每个阶段的实际执行却并没有很深入。在绘制展示完成后,并没有结束所有的工作。APP是需要能够和用户交互的。用户在手机屏幕上的动作,需要做对应的响应,分解到View上也就是对事件的响应。

接下来,对自定义控件这一块学习有以下的规划。

1,详解三大步骤,对其内容进行深度挖掘;

2,交互事件的处理,交互模式下新的绘制流程控制;

3,基于以上内容的学习,进行相关内容的扩展;

(如绘制流程,扩展paint,canvas)

4,自定义控件的实例实现,拆解,强化整个流程;

5,基于以上模式并不能完全理解Adapter模式,并结合设计者模式加以理解、深化。


莫急莫急,流程图的Axture原件在这里!






巴拉巴拉拉:


人生维艰,哪有什么胜利可言,挺住就是一切。


如果一定要有方法,那就是守住崩溃的底线,时刻保持对死亡的畏惧。可以对活着丧失一切的期许,但一定要尊重生命。