很多的时候,android的自带的控件不能满足我们的需求,需要进行自定义view,同时自定义属性,方便自定义view的个性化设计和代码管理,下面简单的介绍一下自定义属性

一、TypedArray类

android.content.res.TypedArrayobtainStyledAttributes(AttributeSet, int[], int, int) obtainAttributes(AttributeSet, int[])

在执行完之后,一定要确保调用 recycle()函数, 用于检索从这个结构对应于给定的属性位置到obtainStyledAttributes中的值

/**     * Give back a previously retrieved StyledAttributes, for later re-use.     */    public void recycle() {        synchronized (mResources.mTmpValue) {            TypedArray cached = mResources.mCachedStyledAttributes;            if (cached == null || cached.mData.length < mData.length) {                mXml = null;                mResources.mCachedStyledAttributes = this;            }        }    }

二、 自定义attrs.xml与原生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 = "your key"                    />


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)属性定义:
   <span style="white-space:pre"></span>       <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"                     />

三、实例演示

1、attrs.xml

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


2、my_view_main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:myview="http://schemas.android.com/apk/res/cn.jon.demo"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <cn.view.demo.MyView        android:layout_width="match_parent"        android:layout_height="match_parent"        myview:textColor="#00ff00"        myview:textSize="26sp">    </cn.view.demo.MyView></LinearLayout>


3、MyView.java

package cn.view.demo;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.util.AttributeSet;import android.view.View;import cn.jon.demo.R;public class MyView extends View {private Paint mPaint;public MyView(Context context) {this(context, null);}public MyView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public MyView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);initViews(context, attrs);}private void initViews(Context context, AttributeSet attrs) {mPaint = new Paint();TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyView);int textColor = a.getColor(R.styleable.MyView_textColor, 0);float textSize = a.getDimension(R.styleable.MyView_textSize, 35);mPaint.setTextSize(textSize);mPaint.setColor(textColor);a.recycle();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);mPaint.setAntiAlias(true);canvas.drawCircle(getWidth() / 2, getHeight() / 2, 80, mPaint);mPaint.setColor(Color.RED);canvas.drawText("circle", getWidth() / 2-40, getHeight() / 2, mPaint);mPaint.setColor(Color.BLUE);mPaint.setStrokeWidth(5);for (int y =30,alpha=255 ;alpha>2 ; alpha>>=1,y+=10) {mPaint.setAlpha(alpha);canvas.drawLine(getWidth() / 2-40,getHeight() / 2-y, 100, getHeight() / 2-y, mPaint);}}}

4、MyActivity.java

package cn.view.demo;import cn.jon.demo.R;import android.app.Activity;import android.os.Bundle;public class MyActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//setContentView(new MyView(this));setContentView(R.layout.my_view_main);}}

5、运行效果

Android中自定义属性(attrs.xml,TypedArray的使用)_第1张图片






更多相关文章

  1. 初学者----Android 自定义View,进度条,第三方框架
  2. android 属性系统 及其 补充
  3. android webview 加载进度和自定义404错误页面
  4. Android GridView 特殊属性
  5. Android 自定义RadioButton或CheckBox选择样式
  6. 如何在Android平台上创建自定义的Cordova插件并使用SAP UI5消费

随机推荐

  1. Android中gravity的各种效果图
  2. Android(安卓)Service
  3. 通用(任何android机型)Root教程(完整版!附砖
  4. Xamarin.Android使用教程之创建第一个And
  5. Android studio导入Github的项目
  6. 键盘设备三星在Android上的改进对Develop
  7. eclipse android sdk can`t fount adb.ex
  8. 关闭 / 隐藏 Android(安卓)软键盘
  9. Android工具箱APP源码分享:“一个工具箱”
  10. Android知识简单测试题