关于自定义View的一些东西

简介:

一、Android中View的绘制流程

最近要做一个关于绘图的demo,不太清楚用什么方法来进行绘图,也不知道这个方法怎么进行绘图,这个方法的工作原理,于是上网找到了一些资料,在这里分享一下。

整个View树的绘图流程是在ViewRoot.java类的performTraversals()函数展开的,该函数做的执行过程可简单概况为根据之前设置的状态,判断是否需要重新计算视图大小(measure)、是否重新需要安置视图的位置(layout)、以及是否需要重绘 (draw),其框架过程如下:

流程一: mesarue()过程

主要作用:为整个View树计算实际的大小,即设置实际的高(对应属性:mMeasuredHeight)和宽(对应属性:

 mMeasureWidth),每个View的控件的实际宽高都是由父视图和本身视图决定的。

具体的调用链如下

        ViewRoot根对象地属性mView(其类型一般为ViewGroup类型)调用measure()方法去计算View树的大小,回调View/ViewGroup对象的onMeasure()方法,该方法实现的功能如下:

        1、设置本View视图的最终大小,该功能的实现通过调用setMeasuredDimension()方法去设置实际的高(对应属性:mMeasuredHeight)和宽(对应属性:mMeasureWidth);

        2 、如果该View对象是个ViewGroup类型,需要重写该onMeasure()方法,对其子视图进行遍历的measure()过程。

       2.1  对每个子视图的measure()过程,是通过调用父类ViewGroup.java类里的measureChildWithMargins()方法去实现,该方法内部只是简单地调用了View对象的measure()方法。(由于measureChildWithMargins()方法只是一个过渡层更简单的做法是直接调用View对象的measure()方法)。

整个measure调用流程就是个树形的递归过程


流程二、 layout布局过程:

主要作用 :为将整个根据子视图的大小以及布局参数将View树放到合适的位置上。

具体的调用链如下:

      host.layout()开始View树的布局,继而回调给View/ViewGroup类中的layout()方法。具体流程如下:

       1 、layout方法会设置该View视图位于父视图的坐标轴,即mLeft,mTop,mLeft,mBottom(调用setFrame()函数去实现)

接下来回调onLayout()方法(如果该View是ViewGroup对象,需要实现该方法,对每个子视图进行布局) ;

      2、如果该View是个ViewGroup类型,需要遍历每个子视图chiildView,调用该子视图的layout()方法去设置它的坐标值。


流程三、 draw()绘图过程

由ViewRoot对象的performTraversals()方法调用draw()方法发起绘制该View树,值得注意的是每次发起绘图时,并不

会重新绘制每个View树的视图,而只会重新绘制那些“需要重绘”的视图,View类内部变量包含了一个标志位DRAWN,当该视图需要重绘时,就会为该View添加该标志位。

调用流程 :

    mView.draw()开始绘制,draw()方法实现的功能如下:

         1 、绘制该View的背景

         2 、为显示渐变框做一些准备操作(见5,大多数情况下,不需要改渐变框)          

         3、调用onDraw()方法绘制视图本身   (每个View都需要重载该方法,ViewGroup不需要实现该方法)

         4、调用dispatchDraw ()方法绘制子视图(如果该View类型不为ViewGroup,即不包含子视图,不需要重载该方法)

值得说明的是,ViewGroup类已经为我们重写了dispatchDraw ()的功能实现,应用程序一般不需要重写该方法,但可以重载父类

函数实现具体的功能。

           4.1dispatchDraw()方法内部会遍历每个子视图,调用drawChild()去重新回调每个子视图的draw()方法(注意,这个

地方“需要重绘”的视图才会调用draw()方法)。值得说明的是,ViewGroup类已经为我们重写了dispatchDraw()的功能

实现,应用程序一般不需要重写该方法,但可以重载父类函数实现具体的功能。


二、如何自定义的View加入到布局中

在解决了自定义View进行后绘图后,不知道怎么将这个View的实例添加到已经设定好的布局里,于是问了一下组长,找到了解决方法。

举个实例:

1.声明定义了一个LinearLayout的实例对象layout;

2.声明定义了一个自定义View的实例对象view;

3.使用layout.addView(view)就可以完成要求


4.GameView gameview =new GameView();

5.// 定义了一个LinearLayout用来显示自定义的view

6.       LinearLayout layout = new LinearLayout(this);

7.       LinearLayout.LayoutParams params =new LinearLayout.LayoutParams(

8.              ViewGroup.LayoutParams.WRAP_CONTENT,

9.              ViewGroup.LayoutParams.WRAP_CONTENT);

10.// 将自定义的GameView添加到LinearLayout

11.       layout.addView(gameview);

本文转自HDDevTeam 51CTO博客,原文链接:http://blog.51cto.com/hddev/1217500,如需转载请自行联系原作者


相关文章
|
XML Android开发 数据格式
自定义View入门
自定义View入门
|
XML 前端开发 Android开发
Android自定义View-入门(明白自定义View和自定义ViewGroup)
为什么要自定义View? 主要是Andorid系统内置的View 无法实现我们的 需求,我们需要针对我们的业务需求定制我们想要的 View.
130 0
Android自定义View-入门(明白自定义View和自定义ViewGroup)
|
前端开发 Android开发
Android进阶之绘制-自定义View完全掌握(四)
Android进阶之绘制-自定义View完全掌握(四)
107 0
Android进阶之绘制-自定义View完全掌握(四)
|
容器
自定义View
自定义View 画一个实心圆 效果图 创建attrs.xml文件 初始化样式属性 支持Padding属性 支持wrap_content属性 布局文件中的应用 画一个带外圆环的圆 效果图 创建attrs.xml文件 初始化样式属性 内圆与外圆环的绘制 布局文件中的应用 画一个外圆环可根据数值变动的圆 效果图 创建attrs.xml文件 初始化样式属性 绘制View 提供方法修改样式 布局文件中的应用
104 0
自定义View
|
前端开发
自定义View -简单的 SwitchView
前言 实现一个简单的滑动开发,效果图如下: switchView完整版本 分析 平分整个View为两份 平分VIew 测量字体的高度和宽度,确定左右View的文字的位置并进行绘制 确定字体的位置和绘制 绘制...
1029 0
|
XML Android开发 数据格式
3.6 自定义View (3.6.2)
本文对应项目的码云地址:https://gitee.com/wanchuanxy/AndroidHeroesTest/tree/master/3/SystemWidget 3.6.2 创建复合控件 创建复合控件可以很好地创建出具有重用功能的控件集合。
658 0
|
前端开发 Android开发
3.6 自定义View (3.6.1)
本文对应项目的码云地址:https://gitee.com/wanchuanxy/AndroidHeroesTest/tree/master/3/SystemWidget Android给我们提供了丰富的组件库来创建丰富的UI效果,同时也提供了非常方便的拓展方法。
735 0
|
Android开发
自定义View解决滑动冲突
最近在读Android开发艺术探索,本文作为自己对view的滑动冲突的理解和实践记录 而滑动冲突,需要了解Android的事件分发机制,如果这个还有些疑惑的地方,请参考这篇文章,以及其中的参考文章 还需要View的Measure和Layout的相关知识View的Measure流程总结 自定义view注意 1.
1083 0
|
XML 数据格式
自定义View(一)
一、初探 大家都知道自定义view需要重写onMeasure和onDraw两个方法,这里我们在讲这两个方法前首先看看什么时候走这两个方法,这里只是大致讲讲方便理解,详细的之后会说。
750 0
|
XML 数据格式 容器
自定义View(二)简单的viewgroup
上篇讲了自定义View的简单实现,这章就趁热打铁,讲讲自定义ViewGroup的简单实现。 一、初探 和上篇一样,看看ViewGroup的绘制是什么走的。
782 0