文档章节

Android 中自定义控件和属性(attr.xml,declare-styleable,TypedArray)的方法和使用

SuShine
 SuShine
发布于 2015/06/25 15:27
字数 612
阅读 16
收藏 1

今天我们的教程是根据前面一节扩展进行的,如果你没有看,请点击 Android高手进阶教程(三) 查看第三课,这样跟容易方便你的理解!

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

 

进入主题。大致以下步骤:

 

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

 

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <declare-styleable name="MyView">  
  4.         <attr name="textColor" format="color" />  
  5.         <attr name="textSize" format="dimension" />  
  6.     </declare-styleable>  
  7. </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() 方法,为了保持以后使用该属性一致性!

 

  1. public MyView(Context context,AttributeSet attrs)  
  2.     {  
  3.         super(context,attrs);  
  4.         mPaint = new Paint();  
  5.           
  6.         TypedArray a = context.obtainStyledAttributes(attrs,  
  7.                 R.styleable.MyView);  
  8.           
  9.         int textColor = a.getColor(R.styleable.MyView_textColor,  
  10.                 0XFFFFFFFF);  
  11.         float textSize = a.getDimension(R.styleable.MyView_textSize, 36);  
  12.           
  13.         mPaint.setTextSize(textSize);  
  14.         mPaint.setColor(textColor);  
  15.           
  16.         a.recycle();  
  17.     }  

MyView.java  MyView控件全部代码如下:

 

  1. package com.android.tutor;  
  2. import android.content.Context;  
  3. import android.content.res.TypedArray;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Color;  
  6. import android.graphics.Paint;  
  7. import android.graphics.Rect;  
  8. import android.graphics.Paint.Style;  
  9. import android.util.AttributeSet;  
  10. import android.view.View;  
  11. public class MyView extends View {  
  12.     private Paint mPaint;  
  13.     private Context mContext;  
  14.     private static final String mString = "Welcome to Mr Wei's blog";  
  15.       
  16.     public MyView(Context context) {  
  17.         super(context);  
  18.         mPaint = new Paint();  
  19.     }  
  20.     public MyView(Context context,AttributeSet attrs)  
  21.     {  
  22.         super(context,attrs);  
  23.         mPaint = new Paint();  
  24.           
  25.         TypedArray a = context.obtainStyledAttributes(attrs,  
  26.                 R.styleable.MyView);  
  27.           
  28.         int textColor = a.getColor(R.styleable.MyView_textColor,  
  29.                 0XFFFFFFFF);  
  30.         float textSize = a.getDimension(R.styleable.MyView_textSize, 36);  
  31.           
  32.         mPaint.setTextSize(textSize);  
  33.         mPaint.setColor(textColor);  
  34.           
  35.         a.recycle();  
  36.     }  
  37.     @Override  
  38.     protected void onDraw(Canvas canvas) {  
  39.         // TODO Auto-generated method stub  
  40.         super.onDraw(canvas);  
  41.         //设置填充  
  42.         mPaint.setStyle(Style.FILL);  
  43.           
  44.         //画一个矩形,前俩个是矩形左上角坐标,后面俩个是右下角坐标  
  45.         canvas.drawRect(new Rect(1010100100), mPaint);  
  46.           
  47.         mPaint.setColor(Color.BLUE);  
  48.         //绘制文字  
  49.         canvas.drawText(mString, 10110, mPaint);  
  50.     }  
  51. }  

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

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

 

main.xml 全部代码如下:

 

  1. <?xml   
  2. version="1.0" encoding="utf-8"?>  
  3. <LinearLayout   
  4. xmlns:android="http://schemas.android.com/apk/res/android"  
  5.                 
  6. xmlns:test="http://schemas.android.com/apk/res/com.android.tutor"  
  7.     android:orientation="vertical"  
  8.     android:layout_width="fill_parent"  
  9.     android:layout_height="fill_parent"  
  10.     >  
  11. <TextView    
  12.     android:layout_width="fill_parent"   
  13.     android:layout_height="wrap_content"   
  14.     android:text="@string/hello"  
  15.     />  
  16. <com.android.tutor.MyView  
  17.     android:layout_width="fill_parent"   
  18.     android:layout_height="fill_parent"   
  19.     test:textSize="20px"  
  20.     test:textColor="#fff"  
  21. />  
  22. </LinearLayout>  

 

四、运行之效果如下图:

本文转载自:http://blog.csdn.net/sfshine/article/details/40148063

共有 人打赏支持
SuShine
粉丝 123
博文 541
码字总数 153477
作品 0
朝阳
后端工程师
私信 提问
Android 自定义属性用法详解

最近项目中经常需要用到自定义控件,因此自定义属性也是经常要用到的,在此说明一下自定义属性的用法: 自定义属性都存在于/value/attr.xml文件中,以如下格式存在。 <resource> <declare-st...

TedYin
2014/04/12
0
0
android--------自定义控件 之 属性篇

上篇介绍了自定义控件的一个简单案例,本篇文章主要介绍如何给自定义控件自定义一些属性。 Android 中使用自定义属性的一般步骤: 定义declare-styleable,添加attr 使用TypedArray获取自定义...

切切歆语
05/03
0
0
declare-styleable:自定义控件的属性

做Android布局是件很享受的事,这得益于他良好的xml方式。使用xml可以快速有效的为软件定义界面。可是有时候我们总感觉官方定义的一些基本组件不够用,自定义组件就不可避免了。那么如何才能...

Jonson
2015/01/30
0
0
Android高手进阶教程(四)之----Android 中自定义属性(attr.xml,TypedArray)的使用!

今天我们的教程是根据前面一节扩展进行的,如果你没有看,请点击 Android高手进阶教程(三) 查看第三课,这样跟容易方便你的理解! 在xml 文件里定义控件的属性,我们已经习惯了android:attrs="...

迷途d书童
2012/03/02
3K
2
Android自定义属性

自定义属性 在res/values目录下增加属性定义文件attr.xml 通过标签声明了自定义属性,通过name属性来确定引用的名称。标签定义哪些属性:name属性名称,format属性类型,有:string , intege...

火烧
2016/01/16
132
0

没有更多内容

加载失败,请刷新页面

加载更多

oh-my-zsh 自定义

GitHub 地址 基于 oh-my-zsh 的自定义配置,增加了一些个人常用插件与皮肤。 采用的是 git submodule 来维护,包括 oh-my-zsh,之所以这么搞,主要是手头有多台 linux 需要维护, 每台机器、...

郁也风
今天
5
0
Docker安装踩坑:E_FAIL 0x80004005的解决

参考 菜鸟教程--Windows Docker 安装 http://www.runoob.com/docker/windows-docker-install.html 官方文档-Install Docker Toolbox on Windows https://docs.docker.com/toolbox/toolbox_in......

karma123
今天
5
0
js垃圾回收机制和引起内存泄漏的操作

JS的垃圾回收机制了解吗? Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。 JS中最常见的垃圾回收方式是标记清除。 工作原理:是当变量进入环境时,将这个变量标记为“...

Jack088
昨天
17
0
大数据教程(10.1)倒排索引建立

前面博主介绍了sql中join功能的大数据实现,本节将继续为小伙伴们分享倒排索引的建立。 一、需求 在很多项目中,我们需要对我们的文档建立索引(如:论坛帖子);我们需要记录某个词在各个文...

em_aaron
昨天
27
0
"errcode": 41001, "errmsg": "access_token missing hint: [w.ILza05728877!]"

Postman获取微信小程序码的时候报错, errcode: 41001, errmsg: access_token missing hint 查看小程序开发api指南,原来access_token是直接当作parameter的(写在url之后),scene参数一定要...

两广总督bogang
昨天
33
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部