Android使用AttributeSet自定义控件的方法

参考资料:

http://www.cnblogs.com/zwl12549/archive/2011/04/13/2015366.html

http://blog.csdn.net/Android_Tutor/article/details/5508615

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

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

 

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

   1.自定义控件和其他的控件一样,应该写成一个类,而这个类的属性自己决定.选择方法进行重写(可以自己定义接口方法 );

   2. 建立res/values目录下的attrs.xml的文件,并在此文件中增加对控件的属性的定义(用于以后此控件的引用可设置属性).

   3.使用AttributeSet来完成控件类的构造函数(一般为2个参数的),并在构造函数中将此控件类中属性变量与attrs.xml中的属性用TypedArray连接起来.并使用。

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

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

 

   好了,按照上述的方法,我们来看看如下代码:

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

   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 class MyViewextends View

{  

      int textColor

       float textSize

        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);           

           textColor =a.getColor(R.styleable.MyView_textColor,0XFFFFFFFF);  

           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-styleablename="MyView">标签来告诉框架它包含的属性就是自定义控件MyView中的属性.黄色的两其实就对应了代码1中黄色的变量.

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

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

   我们再看一下代码1中的蓝色代码,其中使用AttributeSet来重载构造函数.在此函数中将类中的属性变量与代码二中定义的属性联系起来.TypedArray 通常最后调用 .recycle() 方法来完成资源的回收,为了保持以后使用该属性一致性!

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

   4.将自定义的控件类定义到布局用的xml文件中去. 并且使用自定义属性,自定义属性必须加上(换句话说,如果自定义的控件没有自定义属性,那么就没没有表要加):xmlns:test="http://schemas.android.com/apk/res/com.android.tutor"

  蓝色 是自定义属性的前缀,红色 是我们包名.但是在android studio中第三方控件都使用这个命名空间:xmlns:custom="http://schemas.android.com/apk/res-auto"

-----代码3:

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

   <?xml version="1.0" encoding="utf-8"?>  

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android

       xmlns:test="http://schemas.android.com/apk/res/com.android.tutor"

       android:orientation="vertical"

       android:layout_width="fill_parent"

       android:layout_height="fill_parent"  

       <TextView android:layout_width="fill_parent"   

           android:layout_height="wrap_content"   

           android:text="@string/hello" />  

       <com.android.tutor.MyView 

           android:layout_width="fill_parent"   

           android:layout_height="fill_parent" 

           test:textSize="20px" 

          test:textColor="#fff" />  

   </LinearLayout>

其中红色部分在布局中引用了我们MyView控件.

当然,如果有需要,可以把此自定义控件制作为一个myview.xml布局文件表示的UI模版,如下:

<com.android.tutor.MyView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:test ="http://schemas.android.com/apk/res/com.android.tutor"

          android:layout_width="fill_parent"   

          android:layout_height="fill_parent" 

          test:textSize="20px" 

          test:textColor="#fff">

</ com.android.tutor.MyView >

 这样在其他布局文件中就可以用下面方式进行引用了:

<include layout="@layout/myview" />

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

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

  private MyView mMyView = null;

  mMyView = (MyView)findViewById(R.id.myView);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
设计自定义控件需要以下步骤: 1.创建一个新的 Android Studio 项目。 2.在项目中创建自定义控件的类。该类应继承自 View 或其子类(例如 Button、EditText 等)。 3.在自定义控件类中实现构造函数和必要的方法,例如 onMeasure()、onLayout() 和 onDraw() 等。 4.在布局文件中使用自定义控件。 下面是一个示例代码: ``` public class MyCustomView extends View { private Paint paint; private Rect rect; public MyCustomView(Context context) { super(context); init(); } public MyCustomView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public MyCustomView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { paint = new Paint(); paint.setColor(Color.BLUE); rect = new Rect(0, 0, 100, 100); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int desiredWidth = 200; int desiredHeight = 200; int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int width; int height; if (widthMode == MeasureSpec.EXACTLY) { width = widthSize; } else if (widthMode == MeasureSpec.AT_MOST) { width = Math.min(desiredWidth, widthSize); } else { width = desiredWidth; } if (heightMode == MeasureSpec.EXACTLY) { height = heightSize; } else if (heightMode == MeasureSpec.AT_MOST) { height = Math.min(desiredHeight, heightSize); } else { height = desiredHeight; } setMeasuredDimension(width, height); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawRect(rect, paint); } } ``` 在布局文件中使用自定义控件: ``` <com.example.myapplication.MyCustomView android:layout_width="wrap_content" android:layout_height="wrap_content"/> ``` 以上代码是一个简单的自定义 View,它绘制一个蓝色的矩形。当然,你可以根据需要修改自定义控件的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值