做android开发快三年了,最近准备跳槽,才发现,有好多东西都是做了三年以来不怎么注意的,或者说,这三年以来都是为了实现功能而实现,没太多的想过之间的细节和优化的方向
当重新想去拾起这些东西的时候,才发现,原来自己的知识是多么的浅薄,知其形而不知其实,得其果而不觉其味,悔恨!
有些事情,觉悟之后就如当头一棒,为时未晚矣!
好好总结一下,以博客呈现之。
先从view入手复习。
我们学习android以来,乃至于任何一门编程语言,教程上面教给我们的第一步往往是如何写一个hello world,而android的就是怎么在手机屏幕上显示一个属于自己的hello world。然后,我们会新建一个工程,其中IDE(集成开发环境)会给我们默认新建了一个Activity,并为这个Activity创建了一个xml的布局文件,我们只要点击运行,就会在我们的手机或者模拟器上面显示hello world,向世界问好的第一步就怎么愉快的开始了!
我们知道,一个xml布局文件里面会有一个布局,线性布局(LinearLayout),表格布局(TableLayout),相对布局(RelativeLayout),框架布局(FrameLayout),绝对布局(AbsoluteLayout)等五大布局,我们这里把布局理解为容器,在容器里面会装载着许多控件,TextView,Button,ImageView之类常用的控件,我们可以通过xml的一些属性,layout_margin,layout_width,layout_height之类的属性,确定一个布局或者一个控件的位置,可以通过textSize,textColor之类的属性确定控件的大小风格等,然后我们只要在java代码里面setContentView获取整个布局,然后整个界面就差强人意的显示出来。
我们其实很少的去关心这个过程是怎么实现的,这个布局的大小是怎么测量的,怎么那么刚好摆放到我差不多希望的位置,怎么去刚好的绘制出我希望的颜色,形状等等。
Ok,废话不多说,我们一步步来了解这个过程。
我们从自定义view的角度去解析这个view的生成过程。
我们先区别这两个概念,layout和控件,举个例子,LinearLayout和TextView,前者我们把它称为一个view的容器,后者我们把它理解为容器里面的子view,即ViewGroup和View。
在自定义view中,我们无论继承View或者ViewGroup,一般会去重写onMeasure和onDraw,ViewGroup还会强制的要重写onLayout。
onMeasure----顾名思义,测量,我们要显示一个view或者一个view容器,总得知道这个玩意到底有多大吧,View的话测量自己即可,ViewGroup还得对自己的孩子挨个测量,再加上margin的值,也还真麻烦。与测量相关的,还得提一下测量的三种模式:
1 EXACTLY----对应于xml文件里面的match_parent和固定的dp值;
2 AT_MOST-----对应于xml文件里面的wrap_content,这个自定义view的话就得代码里面给他实现大小咯;
3 UNSPECIFIED----就是父类不限子类的大小(其实应该是限制不了,谁知道listview到底有多长)
onLayout----给控件设置一个合适的位置,这个在ViewGroup里面是必须的,但在View里面其实是没有意义的,试着想下,只有父类有权决定子类的位置,子类的位置自己是不能控制的,你都不知道你的父亲能给你多少,你要的来么,哈哈!
onDraw------绘制,这个就是真正显示在你的手机屏幕上的咯,绘制是在前两个步骤之后的,绘制的必备工具是画布和画笔,然后你就可以龙飞凤舞的表演了,这个要设置的东西太多,往后再考虑review一下。
三个过程都简单过了一遍,其实每一个xml的绘制过程都要经过这三个步骤,其实也不简单,但这些步骤回想一下,会觉得很合情理。当然,要完成一个完美的自定义view,其实还没那么简单,很多时候,需要到滑动监听的时候,我们还要去重写onTouchEvent等方法,获取当前屏幕的宽高,与当前滑动的对比等等。当然其实我们自定义view不一定要去继承view和viewgroup这两个老祖宗,我们可以继承他们的子类,HorizontalScroView等等,然后完成起来就能事半功倍了!
今天先复习那么一点,往后继续!
继续努力,再接再厉!