您的位置:首页 > 移动开发 > Android开发

Android自定义控件属性详解

2015-08-06 17:27 459 查看
一、在xml 文件里定义控件的属性

       我们已经习惯了android:attrs="" ,那么我们能不能定义自己的属性能,比如:test:attrs="" 呢?答案是肯定的.例如:  

  在res/values文件下定义一个attrs.xml文件.代码如下:  

       <?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>  

二、在java代码中实现构造方法

 我们在MyView.java 代码修改如下:

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

 }   

 

 MyView.java 全部代码如下:

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

    }     

}    

         我们获取定义的属性我们R.sytleable.MyView_textColor, 获取方法中后面通常设定默认值(float textSize = a.getDimension(R.styleable.MyView_textSize, 36 ); ), 防止我们在xml 文件中没有定义.从而使用默认值!获取MyView 就是定义在<declare-styleable name="MyView "></declare-styleable> 里的名字,获取里面属性用 名字_ 属性 ;连接起来就可以.TypedArray
;通常最后调用 .recycle() 方法,为了保持以后使用该属性一致性!

三、引用自定义属性

       将我们自定义的MyView 加入布局main.xml 文件中,平且使用自定义属性,自定义属性必须加上:

  xmlns:test ="http://schemas.android.com/apk/res/com.android.tutor"蓝色 是自定义属性的前缀,红色 是我们包名.

main.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>   

四、Android中自定义属性的格式详解:

1. reference:参考某一资源ID。

 

    (1)属性定义:

 

            <declare-styleable name = "名称">

                   <attr name = "background" format = "reference" />

            </declare-styleable>

 

    (2)属性使用:

 

             <ImageView

                     android:layout_width = "42dip"

                     android:layout_height = "42dip"

                     android:background = "@drawable/图片ID"

                     />

 

2. color:颜色值。

 

    (1)属性定义:

 

            <declare-styleable name = "名称">

                   <attr name = "textColor" format = "color" />

            </declare-styleable>

 

    (2)属性使用:

 

            <TextView

                     android:layout_width = "42dip"

                     android:layout_height = "42dip"

                     android:textColor = "#00FF00"

                     />

 

3. boolean:布尔值。

 

    (1)属性定义:

 

            <declare-styleable name = "名称">

                   <attr name = "focusable" format = "boolean" />

            </declare-styleable>

 

    (2)属性使用:

 

            <Button

                    android:layout_width = "42dip"

                    android:layout_height = "42dip"

                    android:focusable = "true"

                    />

 

4. dimension:尺寸值。

 

    (1)属性定义:

 

            <declare-styleable name = "名称">

                   <attr name = "layout_width" format = "dimension" />

            </declare-styleable>

 

    (2)属性使用:

 

            <Button

                    android:layout_width = "42dip"

                    android:layout_height = "42dip"

                    />

 

5. float:浮点值。

 

    (1)属性定义:

 

            <declare-styleable name = "AlphaAnimation">

                   <attr name = "fromAlpha" format = "float" />

                   <attr name = "toAlpha" format = "float" />

            </declare-styleable>

 

    (2)属性使用:

 

            <alpha

                   android:fromAlpha = "1.0"

                   android:toAlpha = "0.7"

                   />

 

6. integer:整型值。

 

    (1)属性定义:

 

            <declare-styleable name = "AnimatedRotateDrawable">

                   <attr name = "visible" />

                   <attr name = "frameDuration" format="integer" />

                   <attr name = "framesCount" format="integer" />

                   <attr name = "pivotX" />

                   <attr name = "pivotY" />

                   <attr name = "drawable" />

            </declare-styleable>

 

    (2)属性使用:

 

            <animated-rotate

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

                   android:drawable = "@drawable/图片ID"  

                   android:pivotX = "50%"  

                   android:pivotY = "50%"  

                   android:framesCount = "12"  

                   android:frameDuration = "100"

                   />

 

7. string:字符串。

 

    (1)属性定义:

 

            <declare-styleable name = "MapView">

                   <attr name = "apiKey" format = "string" />

            </declare-styleable>

 

    (2)属性使用:

 

            <com.google.android.maps.MapView

                    android:layout_width = "fill_parent"

                    android:layout_height = "fill_parent"

                    android:apiKey = "0jOkQ80oD1JL9C6HAja99uGXCRiS2CGjKO_bc_g"

                    />

 

8. fraction:百分数。

 

    (1)属性定义:

 

            <declare-styleable name="RotateDrawable">

                   <attr name = "visible" />

                   <attr name = "fromDegrees" format = "float" />

                   <attr name = "toDegrees" format = "float" />

                   <attr name = "pivotX" format = "fraction" />

                   <attr name = "pivotY" format = "fraction" />

                   <attr name = "drawable" />

            </declare-styleable>

 

    (2)属性使用:

 

            <rotate

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

               android:interpolator = "@anim/动画ID"

                   android:fromDegrees = "0" 

               android:toDegrees = "360"

                   android:pivotX = "200%"

                   android:pivotY = "300%" 

               android:duration = "5000"

                   android:repeatMode = "restart"

                   android:repeatCount = "infinite"

                   />

 

9. enum:枚举值。

 

    (1)属性定义:

 

            <declare-styleable name="名称">

                   <attr name="orientation">

                          <enum name="horizontal" value="0" />

                          <enum name="vertical" value="1" />

                   </attr>            

            </declare-styleable>

 

    (2)属性使用:

 

            <LinearLayout

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

                    android:orientation = "vertical"

                    android:layout_width = "fill_parent"

                    android:layout_height = "fill_parent"

                    >

            </LinearLayout>

 

10. flag:位或运算。

 

     (1)属性定义:

 

             <declare-styleable name="名称">

                    <attr name="windowSoftInputMode">

                            <flag name = "stateUnspecified" value = "0" />

                            <flag name = "stateUnchanged" value = "1" />

                            <flag name = "stateHidden" value = "2" />

                            <flag name = "stateAlwaysHidden" value = "3" />

                            <flag name = "stateVisible" value = "4" />

                            <flag name = "stateAlwaysVisible" value = "5" />

                            <flag name = "adjustUnspecified" value = "0x00" />

                            <flag name = "adjustResize" value = "0x10" />

                            <flag name = "adjustPan" value = "0x20" />

                            <flag name = "adjustNothing" value = "0x30" />

                     </attr>         

             </declare-styleable>

 

     (2)属性使用:

 

            <activity

                   android:name = ".StyleAndThemeActivity"

                   android:label = "@string/app_name"

                   android:windowSoftInputMode = "stateUnspecified | stateUnchanged | stateHidden">

                   <intent-filter>

                          <action android:name = "android.intent.action.MAIN" />

                          <category android:name = "android.intent.category.LAUNCHER" />

                   </intent-filter>

             </activity>

 

     注意:

 

     属性定义时可以指定多种类型值。

 

    (1)属性定义:

 

            <declare-styleable name = "名称">

                   <attr name = "background" format = "reference|color" />

            </declare-styleable>

 

    (2)属性使用:

 

             <ImageView

                     android:layout_width = "42dip"

                     android:layout_height = "42dip"

                     android:background = "@drawable/图片ID|#00FF00"

                     />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息