zoukankan      html  css  js  c++  java
  • android 自定义控件中获取属性的三种方式(转)

    第一种方法,直接设置属性值,通过attrs.getAttributeResourceValue拿到这个属性值。

    (1)在xml文件中设置属性值

    <com.example.activity.IconTextView   
           android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:text="@string/smile1"  
        iconSrc="@drawable/smile"/>  

    (2)在构造函数中拿到这个值

    public IconTextView(Context context, AttributeSet attrs) {  
            super(context, attrs);  
            resourceID = attrs.getAttributeResourceValue(null, "iconSrc", 0);  
            if(resourceID > 0) {  
                bitmap = BitmapFactory.decodeResource(getResources(), resourceID);  
            }  
        }  

    第二种方法,使用自己的命名空间

    (1)注意在xml文件中,需要声明一个命名空间,形式为http:// + 这个VIEW的包名

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        xmlns:mobile="http://com.example.activity"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        android:orientation="vertical" >  
      
        <com.example.activity.IconTextView   
            android:layout_width="fill_parent"  
            android:layout_height="wrap_content"  
            android:text="@string/smile1"  
            mobile:iconSrc="@drawable/smile"/>  
      
    </LinearLayout>  

    (2)通过attrs.getAttributeResourceValue,其中第一个参数为命名空间。

    1. //命名空间  

    private final String namespace = "http://com.example.activity" 

     public IconTextView(Context context, AttributeSet attrs) {  
            super(context, attrs);  
            resourceID = attrs.getAttributeResourceValue(namespace, "iconSrc", 0);  
    //      TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.IconTextView);  
    //      resourceID = array.getResourceId(R.styleable.IconTextView_iconSrc, 0);  
            if(resourceID > 0) {  
                bitmap = BitmapFactory.decodeResource(getResources(), resourceID);  
            }  
        }  

    第三种方法,通过自定义attrs.xml来实现

    (1)自定义一个attrs.xml文件

    <?xml version="1.0" encoding="utf-8"?>  
    <resources>  
        <declare-styleable name="IconTextView">  
            <attr name="iconSrc" format="reference"/>  
        </declare-styleable>  
    </resources>  

    (2)在xml文件中使用这一属性,注意此时命名空间的书写规范。

    <?xml version="1.0" encoding="utf-8"?>  
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        xmlns:mobile="http://schemas.android.com/apk/res/com.example.activity"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        android:orientation="vertical" >  
      
        <com.example.activity.IconTextView   
            android:layout_width="fill_parent"  
            android:layout_height="wrap_content"  
            android:text="@string/smile1"  
            mobile:iconSrc="@drawable/smile"/>  
          
        <com.example.activity.IconTextView   
            android:layout_width="fill_parent"  
            android:layout_height="wrap_content"  
            android:text="@string/smile2"  
            android:textSize="24dp"  
            mobile:iconSrc="@drawable/smile"/>  
          
        <com.example.activity.IconTextView   
            android:layout_width="fill_parent"  
            android:layout_height="wrap_content"  
            android:text="@string/smile3"  
            android:textSize="36dp"  
            mobile:iconSrc="@drawable/smile"/>  
          
      
    </LinearLayout>  

    (3)在代码中使用context.obtainStyledAttributes获得属性值

    package com.example.activity;  
      
    import android.content.Context;  
    import android.content.res.TypedArray;  
    import android.graphics.Bitmap;  
    import android.graphics.BitmapFactory;  
    import android.graphics.Canvas;  
    import android.graphics.Rect;  
    import android.util.AttributeSet;  
    import android.widget.TextView;  
      
    public class IconTextView extends TextView {  
        //命名空间  
        private final String namespace = "http://com.example.activity";  
        //资源ID  
        private int resourceID = 0;  
        private Bitmap bitmap;  
      
        public IconTextView(Context context, AttributeSet attrs) {  
            super(context, attrs);  
            TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.IconTextView);  
            resourceID = array.getResourceId(R.styleable.IconTextView_iconSrc, 0);  
            if(resourceID > 0) {  
                bitmap = BitmapFactory.decodeResource(getResources(), resourceID);  
            }  
        }  
          
        @Override  
        public void onDraw(Canvas canvas) {  
            if (bitmap != null) {  
                Rect src = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());  
                  
                Rect target = new Rect();  
                int textHeight = (int)getTextSize();  
                target.left = 0;  
                target.top =(int)(getMeasuredHeight() - getTextSize()) / 2 + 1;  
                target.bottom = target.top + textHeight;  
                target.right = (int)(textHeight * (bitmap.getWidth() / (float)bitmap.getHeight()));  
                  
                canvas.drawBitmap(bitmap, src, target, getPaint());  
                  
                canvas.translate(target.right + 2, 0);  
            }  
              
            super.onDraw(canvas);  
        }  
          
    }  
  • 相关阅读:
    【扫盲】i++和++i的区别
    java 字符串String.intern()方法学习
    随机访问和快速访问
    Semaphore信号量深度解析
    CyclicBarrier回环屏障深度解析
    CountDownLatch深度剖析
    静态代理和装饰者模式的区别
    AspectJ之@DeclareParents注解为对象添加新方法
    C#开发上位机常用
    使用Charles进行抓包、篡改请求、设置代理
  • 原文地址:https://www.cnblogs.com/hubing/p/4715047.html
Copyright © 2011-2022 走看看