Android自定义View之一

来源:互联网 发布:idc源码 编辑:程序博客网 时间:2024/05/16 16:36


学会使用自定义View是非常有必要的,要想成为高手,这个是必须的。看完这篇文章你要到达这样的效果:能自己动手使用自定义属性画一个简单的View,如果看完后你能达到这个效果,那么我们的目标就达到了,如果还没有达到,请回到这里再看一遍。

ok,要学会使用自定义View首先需要了解两个类

Canvas:相当于画画是使用的画布。

Paint:相当于一只画笔。

有了画布和画布就可以动手画东西了。那么这两个类中有哪些常用的方法呢?看下面:

Paint类:

setARGB(int a, int r, int g, int b) // 设置 Paint对象颜色,参数一为alpha透明值
setAlpha(int a) // 设置alpha不透明度,范围为0~255
setAntiAlias(boolean aa) // 是否抗锯齿
setColor(int color) // 设置颜色,这里Android内部定义的有Color类包含了一些常见颜色定义
setTextScaleX(float scaleX) // 设置文本缩放倍数,1.0f为原始
setTextSize(float textSize) // 设置字体大小
setUnderlineText(booleanunderlineText) // 设置下划线

Canvas类:


额,反正是各种draw方法,只要记住用的时候使用draw方法就可以画出各种形状来了。


ok,基础知识了解之后就可以开始动手了。今天就画这么一个圆:



圆的颜色和大小是从自定义属性中获取的,ok,下面就来看看我们总共需要做哪些步骤:

1、自定义一个类,继承自View。

2、在values目录新建一个XML文件叫attrs.xml。

3、将Activity的布局文件换成自定义的类,给自定义属性赋值。


ok,总共3步,那么先来看看自定义View的代码:

public class CircleView extends View {private float height, width, color;public CircleView(Context context) {this(context, null);}public CircleView(Context context, AttributeSet attrs) {super(context, attrs, 0);TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.buttonAttrs);// 获取定义的属性height = ta.getDimension(R.styleable.buttonAttrs_height, 5);width = ta.getDimension(R.styleable.buttonAttrs_width, 5);color = ta.getColor(R.styleable.buttonAttrs_btnColor, Color.BLUE);// 需要调用这个代码,不然下次使用会保留上面的属性值ta.recycle();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 初始化画笔Paint paint = new Paint();paint.setStyle(Style.STROKE);paint.setStrokeWidth(3);paint.setAntiAlias(true);paint.setDither(true);paint.setColor((int) color);// 开始绘画canvas.drawCircle(400, 400, 100, paint);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);setMeasuredDimension((int) width, (int) height);}}

里面重写了2个构造方法,一个onDraw方法一个onMeasure方法,先不去里面的代码,我们接着看上面的第二步,看看attrs里面的代码:

<?xml version="1.0" encoding="UTF-8"?><resources>    <declare-styleable name="buttonAttrs">        <attr name="btnColor" format="color" />        <attr name="height" format="dimension" />        <attr name="width" format="dimension" />    </declare-styleable></resources>
看最后一步,Activity里面布局代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:android_custom="http://schemas.android.com/apk/res/com.xinxue.customeview"    android:layout_width="match_parent"    android:layout_height="match_parent" >    <com.xinxue.customeview.CircleView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android_custom:btnColor="#f00"        android_custom:height="400dp"        android_custom:width="400dp" /></RelativeLayout>

ok,你会发现,Activity.java类里面我没有要你做什么操作,没错,这个类里面不需要我们做任何事情。整个项目搞定了!!!额~~~~~·····这就搞定了嘛??是的,我来说下这个项目运行的机制:首先我们自定义了一个类继承自View,这个类的作用就相当于我们使用TextView啊,Button等等一样,直接在Activity布局文件中使用,不过使用的标签不再只是TextView,而是我们类的全限定类名,也就是包名.类名,类里面画什么样的东西,我们的Activity就显示什么,这样我们只需要控制这个类就可以显示不同的界面了。那么重点就是如何使用View类去控制界面了,还记得上面类重写了4个方法吗?其中有2个构造方法,第一个只有一个参数的构造方法是用来new我们自定义View的时候使用的,含有两个参数的构造方法是用来在我们布局文件中使用自定义时使用的。还有两个方法,一个是onDraw方法一个是onMeasure,前一个方法的功能是用来画界面,后一个方法是用来控制视图的大小的。ok,那么重点就落在这个onDraw方法里面了,我们来看看这个方法的代码:

@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 初始化画笔Paint paint = new Paint();paint.setStyle(Style.STROKE);paint.setStrokeWidth(3);paint.setAntiAlias(true);paint.setDither(true);paint.setColor((int) color);// 开始绘画canvas.drawCircle(400, 400, 100, paint);}

这里代码也很简单,就两部分,一部分是对画笔做设置,一部分是调用Canvas的画圆方法,如果你对它们的方法不清楚,请回到上面看两个类的常用方法。

ok,是不是很简单,那么我们新建的attrs文件里面的属性好像还没有讲到,下面我们来看两个构造方法,含有一个参数的构造方法我们之间调用含有两个参数的方法,ok,那我们来看看两个参数的构造方法里面的代码:

public CircleView(Context context, AttributeSet attrs) {super(context, attrs, 0);TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.buttonAttrs);// 获取定义的属性height = ta.getDimension(R.styleable.buttonAttrs_height, 5);width = ta.getDimension(R.styleable.buttonAttrs_width, 5);color = ta.getColor(R.styleable.buttonAttrs_btnColor, Color.BLUE);// 需要调用这个代码,不然下次使用会保留上面的属性值ta.recycle();}

我们来看obtainStyleAttribute(),这个方法,没错,他就是用来获取我们自定义属性的,第一个参数我们直接传方法自带的参数,第二个参数是R.styleable.buttonAttrs,没错这个buttonAttrs就是我们新建的attrs.xml文件里面的<declare-styleable name="buttonAttrs">,用来获取我们自定义属性数组,这个方法调用之后得到一个TypedArray,这个类里面就是各种getXXX方法,具体就是:


get后面的XXX其实就是我们attrs里面的  <attr name="btnColor" format="color" />标签里面的format属性,format格式就决定了使用getXXX获取到这个属性。啊~说了这么多你还不知道哪个是自定义属性???额~~~~~我应该告诉你的,他就是attrs.xml文件中的attr标签里面的,每一个标签就是一个自定义属性,我们上面定义了3个,所以我们就自定义了3个属性,现在和你说的就是如何使用这个3个属性去控制我们的view的显示。ok~~获取到属性之后我们保存到变量里面,这样我们就可以获取到自定义属性了,额,我们是可以获取到自定义属性了,那么如何给自定义属性赋值呢???它只是一个属性,没有给属性赋值啊!当然,我们需要在Activity的布局文件中去做,我们先来看看里面是什么样的:

    <com.xinxue.customeview.CircleView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android_custom:btnColor="#f00"        android_custom:height="400dp"        android_custom:width="400dp" />

看见这几个没有,和上面的不一样,他是以android_custom开头的,而后面跟的和我们自定义属性attrs.xml里面的name标签是一样的,没错,她就是我们的自定义属性,就是在这里赋值的。那么这个android_custom又是什么鬼~~~~~~~~~我给Activity布局文件的里面所有代码给你看看,你就知道他是什么鬼了:

看见上面标出来的没,原来他是我们的命名空间,什么是命名空间呢??xmlns的全称就是:xmlNameSpace,通俗点来讲就是用来存放xml属性的一块内存区域,引入了这块内存区域,我们才可以使用里面定义的属性。那么我们如何自己去定义一个xml命名空间呢?格式就是xmlns:空间名字="http://schemas.android.com/apk/res/我们自定义view的全限定名称",ok,知道这个之后,我们也就知道那个android_custom:XXX是什么东西了,他就是给我们自定义属性赋值的,如果命名空间里面的空间名字改了,我们对于的也要改android_custom为我们空间的名字。

说了这么多,我们来总结一下自定义属性的步骤:在values下面新建一个attrs.xml文件,在自定义view的两个参数的构造方法中获取这个属性,在Activity布局文件中引入命名空间并且给自定义属性赋值。ok,大概这么多啦~~~~~~~~看完这些,你会不会自己也一个类似的自定义View了呢???当然这只是很简单的会使用,更多注意点和高级使用技巧我以后还会写博客教大家的,欢迎关注我~~~~~

最后附上demo:demo下载

扫描关注我的微信公众号:





0 0