android 绘图

来源:互联网 发布:中国软件协会庐山 编辑:程序博客网 时间:2024/06/06 03:57

            熟悉java GUI的朋友对java绘图必定很熟悉,安卓也沿用了java的绘图原理,但是又新增了xml技术,java绘图所有的图形控件必需代码写出来,安卓可以方便的在xml中配置,其android通过pull解析将xml解析映射到java代码上,在利用view的parent的ondraw()进行深层的绘制。

       简单理解在activity通过contenView方法,安卓windownManger采用pull解析器解析对应控件然后经过测量,摆放,最后绘制到界面上。

        view在安卓中充当具体可见视图东西,视图组件,其可以称之为ViewGroup的子类,填充到父容器中,ViewGroup是一组view的集合,用于存放和管理view的大小和具体位置功能,其可以理解为类似activity和fragment之间的关系,其两者生命周期非常相似,一些常用控件都是view的子类。

        view的周期如同建造一栋房子,我们首先需要筹备材料,然后进行实地测量,在进行具体挖地基,用准备的材料进行修建,最后交付人们居住。

        Android抛弃了UrlClassLoder,只保留了dex和path两种方式,path无法加载未被编译过得java文件,也就是说未被安装过的apk,但是可以加载zip和jar,因此插件化主要采用dex去加载。

        动态加载技术由宿主(host)伪装classLoader来加载Tagit(目标插件),加载结束后的dex文件将会保留到host缓存中,由host运行插件的组件和资源,因此接管插件的生命周期成了插件的最大难点。

       view的大致生命周期

       主要:接收xml完成,进行测量,摆放,绘制,绑定到activity中,其自身还有很多api在不同场景触发,主要是下面6个方法。

1、onFinshinFlate():

        充当建房子的材料准备,此材料收购任务交付WindowManage.setContentView进行实际加载和解析。用来接收在activity中指定的布局文件,等待xml解析器(pull)分别解析完所有子元素控件后触发,用于view或者viewgroup进行之后的一系列工作。

2、onMeasure():

        充当实际选址,和绘图工程图的作用。

        用来实际测量子元素的宽高,其里面子控件可以用Measue()方法来自我进行测绘,如果在viewGroup我们对子布局依次进行测绘赋值,其具体会调用measure进行测绘,其内部会触发MeasureSpec.adjust转换,setMeasuredDimension进行参数设置,最后又会触发子view的onMeasure()的方法,使用递归进行轮询测绘,知道没有任何Child的是指定参数,用MeasureCache来保存测好的值,便于后面的周期使用。

3、onLayout():

        充当根据工程图进行决定地址,房间位置的作用。

        用来进行子控件的具体摆放位置,其和测量的方法都是已经在屏幕右上角的位置开始计算。

        如果在viewGroup中,和上面的测量方法一样,依然采用遍历子控件,依次进行Layout(),到最后还依然递归到onLayout上来,这里不再解释,值得强调的是,如果你在viewGroup中重写onLayout(),不能再继续super.onLayout()方法,因为viewGroup已经没有可以存放的父类了。

4、onDraw():

       充当我们的房子的切墙和粉刷工作。用来做我们测好以及摆放好view的绘制工作,此方法中Canvas和Paint进行基础绘制工作,如果自定义控件这些绘制需要我们自己去绘制,父类的onDraw()为抽象类,具体绘制情况基于你继承的父类控件类型(imageView,textView等),而viewGroup是有view特性的,他是循环子类的onDraw()方法。这就解释了我们如果不继承任何类型的view,如果不重写onDraw()方法,即使已经做了测绘和布局摆放,也无法显示出来,因为系统无法识别你的view该调用哪个对应的onDraw()方法,其父类绘制源码也未做任何处理。

5、onAttachedToWindow()

       充当房子修建完成,交付我们居住了。

       当以上所有工作完成之后,触发此方法,用于绑定到setContentView()的Activity上,此时生命周期交由activity使用,但不代表view停止工作。

6、onDetachedFromWindow()

     和onAttachedToWindow()方法相反,当view被移除出去之后触发。


下面讲一下绘图的一些方法:

1、invalidate()

      此方法用来进行重绘工作,即使宽高和位置不变的情况也会主动调用。

       http://blog.csdn.net/sk719887916/article/details/48443429

2、requestLayout()

       请求重新摆放,给予位置。

        http://blog.csdn.net/sk719887916/article/details/48464035

3、forceLayout()

       清除已摆放的位置数据,释放view的具体坐标。

4、onSizeChanged()

       在view尺寸发生变化时触发,一般父布局的大小不会发生变化的,手机屏幕固定

5、onConfigurationChanged()

       横竖屏切换之后触发,此时view将重新测绘,摆放和绘制重新走一遍。

6、onAnimationStart()

       view有设置动画时触发,默认无动画,此方法对当前view截取bitmap镜像,不断调用draw进行绘制。

7、onSaveInstanceState()

       保存当前的属性状态,便于切换view之前进行可序列传输,当view不可见的时候,此时view的大小,位置和绘制的镜像位图,并未从内存中清除,当view再次显示的时候触发此方法。

       到此大致流程已经熟知。

      当view执行onMeasure()时遍历到子类的时候就会调用子类Measure()的方法,子类在继续调用其onMeasure()方法,当其子类无子类的时候跳出交由父类继续执行onMeasure()方法,依次递归,直到所有子类全部测量完毕为止进行onMeasure()后继续onLayout(),继续遍历子view,如果子类存在调用其Layout,子类内部调用onLayout(),依次递归,直到所有控件布局完毕,后开启onDraw()。






1 0
原创粉丝点击