自定义View增加属性第一步:定义属性资源文件

在/res/values 文件夹下建立“Values XML layout”,按照如下定义一个textview的属性

<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="name" format="reference"/>
<attr name="sex" format="reference"/>
<attr name="age" format="integer"/>
<attr name="textColor" format="color"/>
<attr name="textSize" format="dimension"/>
<declare-styleable name="HsTextView">
<attr name="name"/>
<attr name="sex"/>
<attr name="age"/>
<attr name="textColor"/>
<attr name="textSize"/>
</declare-styleable>
</resources>

节点attr 是定义属性用的,name 是属性名称 ,format 是属性的类型,用<declare-styleable name="HsTextView">来给定义的属性命名,这里在layout里面需要引用这个名字。

另外除了reference与integer color dimension属性以外还有如下属性:

1. float:浮点值。

3. string:字符串

4. fraction:百分数。

5. enum:枚举值

6. flag:是自己定义的,类似于 android:gravity="top",就是里面对应了自己的属性值。

7. reference|color:颜色的资源文件。

8.reference|boolean:布尔值的资源文件

dimension主要是sp与dp属性,在获取的时候需要转换成像素值。reference是资源文件,在layout中设定值的时候需要用"@.."来引入资源文件。不能直接设定,设定完毕之后在layout中如此定义:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:hsTextViewattr="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.skymaster.hs.messagetest.HsTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
hsTextViewattr:name = "@string/name"
hsTextViewattr:sex="@string/sex"
/>
</LinearLayout>

这里要提示一点,xmlns:hsTextViewattr="http://schemas.android.com/apk/res-auto" 这里是指定命名空间,xmlns:XML namespace, 指定的名字是hsTextViewattr,后面要使用这个属性的时候就用“hsTextViewattr:name = "@string/name"”,系统的命名空间是android所以都是"android:layout_width...",有一点需要说明的是在eclipse中这个命名空间的写法是:
  xmlns:你自己定义的名称=http://schemas.android.com/apk/res/你程序的package包名

而在android studio中只要改成"res-auto"这样就方便很多了

自定义View增加属性第二步:在构造函数里获取属性

定义一个自己的View并且继承TextView,重写构造方法获取自定义的属性:

public class HsTextView extends TextView {
private static final String TAG = "HsTextView";
private final String DEFAULT_TEXT_NAME = "默认姓名";
private final int DEFAULT_TEXT_AGE = 100;
private final String DEFAULT_TEXT_SEX = "男";
private final int DEFAULT_TEXT_SIZE = 10;//sp
private final int DEFAULT_TEXT_COLOR = 0xff00c0c0; private String mTextName = DEFAULT_TEXT_NAME;
private int mTextAge = DEFAULT_TEXT_AGE;
private String mTextSex = DEFAULT_TEXT_SEX;
private int mTextColor = DEFAULT_TEXT_COLOR;
private float mTextSize = sp2px(DEFAULT_TEXT_SIZE); public HsTextView(Context context, AttributeSet attrs) {
super(context, attrs);
obtainStyleAttrs(attrs);
} private void obtainStyleAttrs(AttributeSet attrs) {
TypedArray a = getContext().obtainStyledAttributes(attrs,R.styleable.HsTextView);
mTextName = a.getString(R.styleable.HsTextView_name);
mTextSex = a.getString(R.styleable.HsTextView_sex);
mTextAge = a.getInteger(R.styleable.HsTextView_age,mTextAge);
mTextColor = a.getColor(R.styleable.HsTextView_textColor,mTextColor);
mTextSize = (int) a.getDimension(R.styleable.HsTextView_textSize,mTextSize);
setTextColor(mTextColor);
setTextSize(mTextSize);
setText("姓名:"+mTextName+"\n"+"年龄:"+mTextAge+"\n"+"性别:"+mTextSex);
a.recycle();
} public HsTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr); }
private float sp2px(int spVal){
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,spVal,
getResources().getDisplayMetrics());
}
}

通过xml实现空间对象默认调用的是2个参数的构造函数也就是  public HsTextView(Context context, AttributeSet attrs)

这里传入了上下文与AttribueSet,从字面理解就是属性集合,通过Context的obtainStyledAttributes(..)获取属性数组,记得这里要定义的TypeArray使用完之后一定要释放a.recycle();另外一个需要注意的是定义字体大小定义的属性是sp需要转换成像素

所以要使用工具类实现:

sp2px: TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,spVal,getResources().getDisplayMetrics());基本是固定写法。另外dp转px的写法:

dp2px:TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dpVal, getResources().getDisplayMetrics());

这里返回的都是float,根据需要进行类型强制转换。

完成之后就可以显示了自己定义的属性了:

引用博客地址http://blog.csdn.net/vipzjyno1/article/details/23696537

安卓自定义View(一)自定义控件属性的更多相关文章

  1. Android绘图机制(一)——自定义View的基础属性和方法

    Android绘图机制(一)--自定义View的基础属性和方法 自定义View看起来,确实看起来高深莫测,很多Android开发都不是特别在行这一块,这里面的逻辑以及一些绘画都是有一点难的,说一下我目 ...

  2. 安卓自定义View教程目录

    基础篇 安卓自定义View基础 - 坐标系 安卓自定义View基础 - 角度弧度 安卓自定义View基础 - 颜色 进阶篇 安卓自定义View进阶 - 分类和流程 安卓自定义View进阶 - Canv ...

  3. 安卓自定义View进阶-Canvas之画布操作 转载

    安卓自定义View进阶-Canvas之画布操作 转载 https://www.gcssloop.com/customview/Canvas_Convert 本来想把画布操作放到后面部分的,但是发现很多 ...

  4. Android 自定义view中的属性,命名空间,以及tools标签

    昨日看到有人在知乎上问这3个琐碎的小知识点,今天索性就整理了一下,其实这些知识点并不难,但是很多开发者平时很少注意到这些, 导致的后果就是开发的时候 经常会被ide报错,开发效率很低,或者看开源代码的 ...

  5. 安卓自定义View实现图片上传进度显示(仿QQ)

    首先看下我们想要实现的效果如下图(qq聊天中发送图片时的效果): 再看下图我们实现的效果: 实现原理很简单,首先我们上传图片时需要一个进度值progress,这个不管是自己写的上传的方法还是使用第三方 ...

  6. 安卓自定义View实现钟表

    转载请注明出处:http://blog.csdn.net/baiyuliang2013/article/details/45535227 之前实现过html5版的钟表,html5也有一个画板属性Can ...

  7. 安卓自定义View实例-----跟随手指移动的鸟

    今天学习了一些安卓开发中的自定义布局,编写了简单一个实例,“跟随手指移动的鸟”,需要两张图片,背景图片和鸟的图片,鸟的图片可以在屏幕中跟随手指的移动而移动. 1.将两张图片导入到mipmap中: 2. ...

  8. Android 开发学习进程0.12 自定义view activity的属性

    设置类似钉钉或tel的圆形用户名首字母头像 设置有两种方法,一是使用已有的库或自定义的view组件,但如果确定只是文字头像,也可使用textview的backgrou属性,调整资源文件使textvie ...

  9. 安卓自定义View基础 --坐标系,角度弧度,颜色

    转自:https://www.gcssloop.com/customview/CustomViewIndex/ 1.坐标系 2.角度弧度 3.颜色 一.屏幕坐标系和数学坐标系的区别 由于移动设备一般定 ...

随机推荐

  1. java 关键字 assert的学习

    之前在学习java源码时,发现了assert这个不常用的关键字.下面直接来介绍下这个关键字的使用. assert是什么? 它是jdk1.4之后新增加的关键字,没了. assert的作用是什么? ass ...

  2. leetcode:1-5题代码整理

    以下是这段时间抽时间刷的前5题,都是自己想的解法,或许不是最优解,只是整理下,方便日后优化提升 1. Two Sum: class Solution: # @return a tuple, (inde ...

  3. 国内外从事CV相关的企业

    提示:本文为笔者原创,转载请注明出处:blog.csdn.net/carson2005 经常碰到朋友问我国内从事计算机视觉(CV)领域的公司的发展情况,产品情况,甚至找工作等问题,这里,我给出自己收集 ...

  4. Unity 性能

    Unity 5.0 AMD 7650k 自带核显 Unity自建立方体2000正方体 50帧 但每个立方体多达60面 多个三角形 每秒100万面绘制 可能每个都要单独计算光照? 导入3ds模型相当于 ...

  5. jquery checkbox 实现单选

    最近在用javascript的时候发现网上实现checkbox单选的代码都已经过时了. 用着几年前的代码发现根本不行了 原因是jquery api已经更改 http://api.jquery.com/ ...

  6. SOSO街景地图 API (Javascript)开发教程(1)- 街景

    SOSO街景地图 Javascript API 干什么用的? 你想在网页里嵌入个地图,就需要它了! 另外,它还支持:地点搜索.周边/附近查询.地图标注.公交/驾车路线规划.地理坐标与地址相互转换.地理 ...

  7. wex5 实战 登陆帐号更换与用户id一致性

    一 前言 关于用户登陆,注册,页面跳转,我讲了很多,都是页面框架级别的.有人问到这个问题,索性总结一下,今天是收尾最后一篇. 以往初学时的设计是: 1 注册 2 登陆 3 进入页面. 这种很简单,没有 ...

  8. AC6102 开发板千兆以太网UDP传输实验

    AC6102 开发板千兆以太网UDP传输实验 在芯航线AC6102开发板上,设计了一路GMII接口的千兆以太网电路,通过该以太网电路,用户可以将FPGA采集或运算得到的数据传递给其他设备如PC或服务器 ...

  9. php日常日志写入格式记录

    从数据库取出数据数组格式保存 file_put_contents('/tmp/bak_trusted_list'.date('H').'.php', '<?php return '.var_ex ...

  10. openlayers 3 简书

    1. 简书http://www.jianshu.com/p/6785e755fa0d 2. 文档 http://anzhihun.coding.me/ol3-primer/ch03/03-02.htm ...