转帖并消化:Android中一种使用AttributeSet自定义控件的方法
<wbr><wbr><wbr> 文字只表达自己的理解,没有来写代码验证,只是写意而已.本文来引用:</wbr></wbr></wbr>
<wbr><wbr><wbr><a href="http://blog.youkuaiyun.com/Android_Tutor/archive/2010/04/20/5508615.aspx">http://blog.youkuaiyun.com/Android_Tutor/archive/2010/04/20/5508615.aspx</a></wbr></wbr></wbr>
<wbr><wbr><wbr> 博客中内容加以叙述.</wbr></wbr></wbr>
<wbr></wbr>
<wbr><wbr><wbr> 所谓自定义控件(或称组件)也就是编写自己的控件类型,而非Android中提供的标准的控件,如TextView,CheckBox等等.不过自定义的控件一般也都是从标准控件继承来的,或者是多种控件组合,或者是对标准控件的属性进行改变而得到的自己满意的控件.</wbr></wbr></wbr>
<wbr><wbr><wbr> 自定义控件可能会有很多种方法,这里只介绍我要介绍的方法.</wbr></wbr></wbr>
<wbr></wbr>
<wbr><wbr><wbr> 在这种方法中,大概的步骤是这样的</wbr></wbr></wbr>
<wbr><wbr><wbr> 1.我们的自定义控件和其他的控件一样,应该写成一个类,而这个类的属性是是有自己来决定的.</wbr></wbr></wbr>
<wbr><wbr><wbr> 2.我们要在res/values目录下建立一个attrs.xml的文件,并在此文件中增加对控件的属性的定义.</wbr></wbr></wbr>
<wbr><wbr><wbr> 3.使用AttributeSet来完成控件类的构造函数,并在构造函数中将自定义控件类中变量与attrs.xml中的属性连接起来.</wbr></wbr></wbr>
<wbr><wbr><wbr> 4.在自定义控件类中使用这些已经连接的属性变量.</wbr></wbr></wbr>
<wbr><wbr><wbr> 5.将自定义的控件类定义到布局用的xml文件中去.</wbr></wbr></wbr>
<wbr><wbr><wbr> 6.在界面中生成此自定义控件类对象,并加以使用.</wbr></wbr></wbr>
<wbr></wbr>
<wbr><wbr><wbr> 好了,按照上述的方法,我们来看看<a href="http://blog.youkuaiyun.com/Android_Tutor/archive/2010/04/20/5508615.aspx">http://blog.youkuaiyun.com/Android_Tutor/archive/2010/04/20/5508615.aspx</a></wbr></wbr></wbr>
<wbr><wbr><wbr> 博客中的实例代码,按步骤加以解释:</wbr></wbr></wbr>
<wbr><wbr><wbr> //---------------------------------------------------------------------------------</wbr></wbr></wbr>
<wbr><wbr><wbr> 1. 定义自己的控件类:--------------------------------------------代码1.</wbr></wbr></wbr>
<wbr><wbr><wbr> package com.android.tutor;<wbr><wbr><br><wbr><wbr><wbr> import android.content.Context;<wbr><wbr><br><wbr><wbr><wbr> import android.content.res.TypedArray;<wbr><wbr><br><wbr><wbr><wbr> import android.graphics.Canvas;<wbr><wbr><br><wbr><wbr><wbr> import android.graphics.Color;<wbr><wbr><br><wbr><wbr><wbr> import android.graphics.Paint;<wbr><wbr><br><wbr><wbr><wbr> import android.graphics.Rect;<wbr><wbr><br><wbr><wbr><wbr> import android.graphics.Paint.Style;<wbr><wbr><br><wbr><wbr><wbr> import android.util.AttributeSet;<wbr><wbr><br><wbr><wbr><wbr> import android.view.View;<wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><br><wbr><wbr><wbr> public class <span style="color:#ed1c24;">MyView</span> extends View<br><wbr><wbr><wbr> {<wbr><wbr><br><span style="color:#ffc20e;"><wbr><wbr><wbr><wbr><wbr><wbr><wbr> private Paint mPaint;<wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> private Context mContext;<wbr><wbr><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></span><wbr><wbr><wbr><wbr><wbr><wbr><wbr> private static final String mString = "Welcome to Mr Wei's blog";<wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> public MyView(Context context)<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> {<wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> super(context);<wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> mPaint = new Paint();<wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> }<wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><br><span style="color:#2f3699;"><wbr><wbr><wbr><wbr><wbr><wbr><wbr> public MyView(Context context,AttributeSet attrs)<wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> {<wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> super(context,attrs);<wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> mPaint = new Paint();<wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.MyView);<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> int textColor = a.getColor(R.styleable.MyView_textColor,0XFFFFFFFF);<wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> float textSize = a.getDimension(R.styleable.MyView_textSize, 36);<wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> mPaint.setTextSize(textSize);<wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> mPaint.setColor(textColor);<wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> a.recycle();<wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></span></wbr>
<wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span style="color:#22b14c;">@Override<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> protected void onDraw(Canvas canvas)</wbr></wbr></wbr></wbr></wbr></wbr></wbr></span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr> {<wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> // TODO Auto-generated method stub<wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> super.onDraw(canvas);<wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> //设置填充<wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> mPaint.setStyle(Style.FILL);<wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> //画一个矩形,前俩个是矩形左上角坐标,后面俩个是右下角坐标<wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> canvas.drawRect(new Rect(10, 10, 100, 100), mPaint);<wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> mPaint.setColor(Color.BLUE);<wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> //绘制文字<wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> canvas.drawText(mString, 10, 110, mPaint);<wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><wbr><wbr><br><wbr><wbr><wbr> }<wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr> 代码1定义了一个自定义控件,名字为MyView,是从View类继承而来,也就是说它本身就是一种View,只是在View基础上加工而成了我们自己的自定义控件MyView.在此类种黄色的两行变量是我们新的属性变量.</wbr></wbr></wbr>
<wbr></wbr>
<wbr><wbr><wbr> //---------------------------------------------------------------------------------</wbr></wbr></wbr>
<wbr><wbr><wbr> 2. 在res/values目录下建立一个attrs.xml的文件,并在此文件中增加对控件的属性的定义--代码2:</wbr></wbr></wbr>
<wbr><wbr><wbr> <?xml version="1.0" encoding="utf-8"?><br><wbr><wbr><wbr> <resources><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> <declare-styleable name="<span style="color:#ed1c24;">MyView</span>"><br><span style="color:#ffc20e;"><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> <attr name="textColor" format="color" /><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> <attr name="textSize" format="dimension" /><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></span><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></declare-styleable><br><wbr><wbr><wbr> </resources></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr> 在<resources>标签下使用<declare-styleable name="<span style="color:#ed1c24;">MyView</span>">标签来告诉框架它包含的属性就是自定义控件MyView中的属性.黄色的两其实就对应了代码1中黄色的变量.</wbr></wbr></wbr>
<wbr></wbr>
<wbr><wbr><wbr> //---------------------------------------------------------------------------------</wbr></wbr></wbr>
<wbr><wbr><wbr> 3.使用AttributeSet来完成控件类的构造函数,并在构造函数中将自定义控件类中变量与attrs.xml中的属性连接起来.</wbr></wbr></wbr>
<wbr><wbr><wbr> 我们再看一下代码1中的蓝色代码,其中使用<span style="color:#2f3699;">AttributeSet</span><span style="color:#000000;">来重载构造函数.在此函数中将类中的属性变量与代码二中定义的属性联系起来.<br></span></wbr></wbr></wbr>
<wbr><wbr><wbr> //---------------------------------------------------------------------------------</wbr></wbr></wbr>
<wbr><wbr><wbr> 4.在自定义控件类中使用这些已经连接的属性变量.</wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>我们看一下代码1中的黄色部分,就是对我们新定义的属性的使用.</wbr></wbr></wbr></wbr>
<wbr></wbr>
<wbr><wbr><wbr> //---------------------------------------------------------------------------------</wbr></wbr></wbr>
<wbr><wbr><wbr> 5.将自定义的控件类定义到布局用的xml文件中去.-----代码3:</wbr></wbr></wbr>
<wbr><wbr><wbr> 我们再看看布局的xml文件代码:</wbr></wbr></wbr>
<wbr><wbr><wbr> <?xml<wbr>version="1.0" encoding="utf-8"?><wbr><wbr><br><wbr><wbr><wbr> <LinearLayout<wbr>xmlns:android="<a href="http://schemas.android.com/apk/res/android">http://schemas.android.com/apk/res/android</a>"<wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> android:orientation="vertical"<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> android:layout_width="fill_parent"<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> android:layout_height="fill_parent"<wbr>><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> <TextView<wbr>android:layout_width="fill_parent"<wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> android:layout_height="wrap_content"<wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> android:text="@string/hello"<wbr>/><wbr><wbr><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr> <com.android.tutor.MyView<wbr> android:layout_width="fill_parent"<wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> android:layout_height="fill_parent"<wbr>test:textSize="20px"<wbr>test:textColor="#fff" /><wbr><wbr><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><wbr><wbr><wbr> </LinearLayout><br><wbr><wbr><wbr> 其中红色部分在布局中引用了我们MyView控件.</wbr></wbr></wbr></wbr></wbr></wbr>
<wbr></wbr>
<wbr><wbr><wbr> //---------------------------------------------------------------------------------</wbr></wbr></wbr>
<wbr><wbr><wbr> 6.在界面中生成此自定义控件类对象,并加以使用.--------代码4.</wbr></wbr></wbr>
<wbr></wbr>
<wbr><wbr><wbr> //---------------------------------------------------------------------------------</wbr></wbr></wbr>
