zoukankan      html  css  js  c++  java
  • Android 中自定义控件和属性(attr.xml,declarestyleable,TypedArray)的方法和使用 一

    在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> 
    二、 我们在MyView.java 代码编写如下,其中下面的构造方法是重点,我们获取定义的属性R.sytleable.MyView_textColor, 获取方法中后面通常设定默认值(float textSize = a.getDimension(R.styleable.MyView_textSize, 36 ); ), 防止我们在xml 文件中没有定义.从而使用默认值!

    MyView 就是定义在<declare-styleable name="MyView "></declare-styleable> 里的 名字,获取里面属性用 名字_ 属性 连接起来就可以.TypedArray 通常最后调用 .recycle() 方法,为了保持以后使用该属性一致性!
    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  MyView控件全部代码如下:

        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); 
            } 
        } 
    三、将我们自定义的MyView 加入布局main.xml 文件中,并且使用自定义属性,自定义属性必须加上:
    " xmlns:test ="http://schemas.android.com/apk/res/com.android.tutor"  ,test是自定义属性的前缀,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> 
    运行之。

  • 相关阅读:
    2021年-组装ITX台式机电脑
    jetbrain idea误删文件的两种恢复的方法
    Jmeter Macbook上利用命令行ssh tunnel 开启mysql链接
    pipeline buildResult 和 stageResult的区别
    Jenkins Pipeline ample 样板
    docker删除镜像
    C++内存分区
    auto | auto& | auto&&
    一种简易的音频信号延迟测量方案
    自制一个简易的任意音频信号发生器
  • 原文地址:https://www.cnblogs.com/xingmeng/p/2653850.html
Copyright © 2011-2022 走看看