android中-自定义View对象(二)热度 2| 上一篇文 章我们了解android.view.View的原理而且制作了一个功能简单的效果:点击屏幕随机在点击的位置生成一个半径是1-10的圆圈。我们是使用 一个自定义View对象完成的,但是它对View所做的修改有限,只是修改了onDraw和onTouchEvent两个方法,这样不能涵盖整个自定义 View所能完成的功能。所以这里我们再补充下自定义View相关的一些内容。 在SDK文档中描述了View创建的几个主要过程:
上面的列表很详细的将View视图从被创建(Creation)、构建布局(layout)、执行绘图(drawing)、事件处理(Event Processing)、焦点处理(Focus)和被加载到Activity容器(Attaching)的 几个过程所执行的生命周期方法都列出来了。我们可以很清晰的看到它的整个处理过程,当你需要自定义一个View的时候,你可以根据你自定义的View所要 完成的功能选择性的重写上面的几个方法。以上一篇的画实心圆为例,我们重写了它的被创建、执行绘图和事件处理三个方法。 下面我们编写一个自定义View对象,让其可以通过xml文件配置一些自定义属性,可手动设置大小,并在绘图时添加一些自定义的图形。 首先我们编写一个类,继承android.view.View对象,重写里面的构造方法(在构造方法里获取从xml布局文件中设置的自定义属性并执行初始化)、onMeasure方法(实现可以在xml配置文件中定义大小)和onDraw方法(绘制视图内容,同时在视图对象的中间添加一条横线),CustomLabelView.java:
上面代码的一个难点是在于如何测量文字所占的尺寸,文字占用的宽度比较容易计算,但是高度就比较复杂,因为各个字体使用的间距不一样。我们在所有三 个构造方法中执行初始化代码,初始化代码其实没做什么,只是定义了一个画笔对象,它的颜色是白色的,文字大小是16。这边有三个构造方法,它们分别对应的 功能是不一样的: CustomLabelView(Context) :这个构造方法是当程序中动态创建CustomLabelView这个对象时调用的。 CustomLabelView(Context,AttributeSet):这个构造方法是当你使用xml布局文件加载视图对象时系统会调用的构造方法,所以你可以在这个构造方法里通过AttributeSet这个参数获得在xml中对这个视图对象定义的全部xml属性。 CustomLabelView(Context,AttributeSet,int):这个构造方法用得比较少,详细用法我也不是很清楚。 我们在第二个构造方法中获取自定义的属性,然后对View对象配置这些属性,在这个步骤前记得要先定义这些可配置的属性,否则就会报错,具体是定义在res\values\attrs.xml文件中:
这样你就可以在代码中引 用:R.styleable.CustomLabelView,R.styleable.CustomLabelView_text和 R.styleable.CustomLabelView_backgroundColor属性了。然后我们重写了onMeasure方法,在里面做了一 些根据xml的配置测量View内部内容所占的尺寸的测量工作,最后调用setMeasureDimension通知系统测量的最终结果。 然后重写onDraw方法,在这里我们添加了一个自己定义的步骤:在视图所占区域的中间画一条线,最后打出视图中的内容。 布局xml文件,res\layout\custom_view.xml:
在布局文件中我们创建一个LinearLayout容器,按照纵向排列放了3个自定义的视图对象,这边使用自定义视图对象的方式是将xml的节点名 字换成你自定义View的类全路径(包名+类名),然后就可以在节点的属性中配置View的属性。因为上面我们有用到自定义的属性,所以需要自己创建一个 xml名称空间,这个名称空间的规范是:
其中xxx就是下面要引用到的名称空间,yyy一定要是项目的包名(刚创建Android项目时填入的包名,也可以查看 AndroidMenifest.xml文件中menifest根节点中的package属性,就是这个属性值)。因为我项目的包名 是:com.android777.demo.uicontroller,所以我的xml名称空间设置为:
然后我在自定义的View节点中,使用这个名称空间配置在res\values\attrs.xml中定义的text和 backgroundColor属性。这样整个自定义View步骤就完成了,最后只需要一个Activity来查看效 果,CustomLabelViewActivity.java:
|
|