(属性其实就一是一对Key-value的玩意,然后在代码中对这些进行控制,Android的AttributeSet 让我想起了dojo中的玩意,这个其实就是一个键值对的集合,在构造函数中传入的……)

所谓自定义控件(或称组件)也就是编写自己的控件类型,而非Android中提供的标准的控件,如TextView,CheckBox等等.不过自定义的控件一般也都是从标准控件继承来的,或者是多种控件组合,或者是对标准控件的属性进行改变而得到的自己满意的控件.

自定义控件可能会有很多种方法,这里只介绍我要介绍的方法.

在这种方法中,大概的步骤是这样的

1.我们的自定义控件和其他的控件一样,应该写成一个类,而这个类的属性是是有自己来决定的.

2.我们要在res/values目录下建立一个attrs.xml的文件,并在此文件中增加对控件的属性的定义.

3.使用AttributeSet来完成控件类的构造函数,并在构造函数中将自定义控件类中变量与attrs.xml中的属性连接起来.

4.在自定义控件类中使用这些已经连接的属性变量.

5.将自定义的控件类定义到布局用的xml文件中去.

6.在界面中生成此自定义控件类对象,并加以使用.

//---------------------------------------------------------------------------------

1. 定义自己的控件类:--------------------------------------------代码1.

package com.android.tutor;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.view.View;


public classMyViewextends View
{
private Paint mPaint;
private Context mContext;
private static final String mString = "Welcome to Mr Wei's blog";

public MyView(Context context)
{
super(context);
mPaint = new Paint();
}


public MyView(Context context,AttributeSet attrs)
{
super(context,attrs);
mPaint = new Paint();

TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.MyView);
int textColor = a.getColor(R.styleable.MyView_textColor,0XFFFFFFFF);
float textSize = a.getDimension(R.styleable.MyView_textSize, 36);

mPaint.setTextSize(textSize);
mPaint.setColor(textColor);

a.recycle();
}


@Override
protected void onDraw(Canvas canvas)

{
// TODO Auto-generated method stub
super.onDraw(canvas);
//设置填充
mPaint.setStyle(Style.FILL);

//画一个矩形,前俩个是矩形左上角坐标,后面俩个是右下角坐标
canvas.drawRect(new Rect(10, 10, 100, 100), mPaint);

mPaint.setColor(Color.BLUE);
//绘制文字
canvas.drawText(mString, 10, 110, mPaint);
}
}

代码1定义了一个自定义控件,名字为MyView,是从View类继承而来,也就是说它本身就是一种View,只是在View基础上加工而成了我们自己的自定义控件MyView.在此类种黄色的两行变量是我们新的属性变量.

//---------------------------------------------------------------------------------

2. 在res/values目录下建立一个attrs.xml的文件,并在此文件中增加对控件的属性的定义--代码2:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyView">
<attr name="textColor" format="color" />
<attr name="textSize" format="dimension" />
</declare-styleable>
</resources>

在<resources>标签下使用<declare-styleable name="MyView">标签来告诉框架它包含的属性就是自定义控件MyView中的属性.黄色的两其实就对应了代码1中黄色的变量.

//---------------------------------------------------------------------------------

3.使用AttributeSet来完成控件类的构造函数,并在构造函数中将自定义控件类中变量与attrs.xml中的属性连接起来.

我们再看一下代码1中的蓝色代码,其中使用AttributeSet来重载构造函数.在此函数中将类中的属性变量与代码二中定义的属性联系起来.

//---------------------------------------------------------------------------------

4.在自定义控件类中使用这些已经连接的属性变量.

我们看一下代码1中的黄色部分,就是对我们新定义的属性的使用.

//---------------------------------------------------------------------------------

5.将自定义的控件类定义到布局用的xml文件中去.-----代码3:

我们再看看布局的xml文件代码:

<?xmlversion="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextViewandroid:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"/>

<com.android.tutor.MyViewandroid:layout_width="fill_parent"
android:layout_height="fill_parent"test:textSize="20px"test:textColor="#fff" />
</LinearLayout>
其中红色部分在布局中引用了我们MyView控件.

//---------------------------------------------------------------------------------

6.在界面中生成此自定义控件类对象,并加以使用.--------代码4.

//-----------------------

更多相关文章

  1. 使用Kotlin:让Android与JS交互的详解
  2. 在Android中用纯Java代码布局
  3. Android(安卓)上实现水波特效二--优化
  4. android 调试利器之IDA
  5. MVC架构设计与三层模型 & MVP思想精髓与解耦
  6. Android(安卓)Kotlin使用指南
  7. Android(安卓)Studio如何设置代码自动提示
  8. Android、JUnit深入浅出(一)——JUnit初步解析
  9. android应用安全——代码安全(android代码混淆)

随机推荐

  1. python中的类与方法
  2. 在两台服务器上有效地在两个Django应用程
  3. python 核心编程第六章课后题自己做的答
  4. 使用python脚本配置zabbix发送报警邮件
  5. Python PyV8安装测试(Win7)
  6. Python引起的混乱解决之道——感悟
  7. 使用Python操作MongoDB
  8. Python第十天 print >> f,和fd.write()的
  9. 如何用位于括号外的逗号分隔字符串?
  10. 数组与矩阵---需要排序的最短子数组长度