Android 自定义属性(attrs.xml,TypedArray)

做Android布局是件很享受的事,这得益于他良好的xml方式。使用xml可以快速有效的为软件定义界面。可是有时候我们总感觉官方定义的一些基本组 件不够用,自定义组件就不可避免了。那么如何才能做到像官方提供的那些组件一样用xml来定义他的属性呢?现在我们就来讨论一下他的用法。
1、添加文件attrs.xml,位于res\values目录下:

<?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>

2、创建自定义控件:

package com.szy.custom; import com.szy.custom.R; 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 myPaint; private static final String myString = "Hello CustomView!"; public MyView(Context context) { super(context); // TODO Auto-generated constructor stub 
     } public MyView(Context context, AttributeSet attr) { super(context, attr); myPaint = new Paint(); TypedArray a = context.obtainStyledAttributes(attr, R.styleable.myView);//TypedArray是一个数组容器 float textSize = a.getDimension(R.styleable.myView_textSize, 30);//防止在XML文件里没有定义,就加上了默认值30 int textColor = a.getColor(R.styleable.myView_textColor, 0xFFFFFFFF);//同上,这里的属性是:名字_属性名 
         myPaint.setTextSize(textSize); myPaint.setColor(textColor); a.recycle();//我的理解是:返回以前取回的属性,供以后使用。以前取回的可能就是textSize和textColor初始化的那段 
     } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub 
        super.onDraw(canvas); //myPaint = new Paint(); 
         myPaint.setColor(Color.RED); myPaint.setStyle(Style.FILL); canvas.drawRect(new Rect(10,10,100,100), myPaint); myPaint.setColor(Color.WHITE); canvas.drawText(myString, 10, 100, myPaint); } 
}

3、在Activity布局文件中使用自定义控件:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="<a href="http://schemas.android.com/apk/res/android">http://schemas.android.com/apk/res/android</a>" xmlns:test="<a href="http://schemas.android.com/apk/res/com.szy.custom">http://schemas.android.com/apk/res/com.szy.custom</a>" 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.adnroid.test.MyView android:layout_width="fill_parent" android:layout_height="fill_parent" test:textSize="10px" test:textColor="#fff" /> 
</LinearLayout>
附:Android中自定义属性的格式详解
1. reference:参考某一资源ID。(1)属性定义:<declare-styleable name = "名称"><attr name = "background" format = "reference" /></declare-styleable>2)属性使用:<ImageViewandroid: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)属性使用:<TextViewandroid:layout_width = "42dip"android:layout_height = "42dip"android:textColor = "#00FF00"/>
3. boolean:布尔值。(1)属性定义:<declare-styleable name = "名称"><attr name = "focusable" format = "boolean" /></declare-styleable>2)属性使用:<Buttonandroid: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)属性使用:<Buttonandroid: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)属性使用:<alphaandroid: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-rotatexmlns: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.MapViewandroid:layout_width = "fill_parent"android:layout_height = "fill_parent"android:apiKey = "0jOkQ80oD1JL9C6HAja99uGXCRiS2CGjKO_bc_g"/>
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)属性使用:<LinearLayoutxmlns: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)属性定义:<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)属性使用:<activityandroid: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)属性使用:<ImageViewandroid:layout_width = "42dip"android:layout_height = "42dip"android:background = "@drawable/图片ID|#00FF00"/>

 

转载于:https://www.cnblogs.com/zhujiabin/p/4538032.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle的基本概念,oracle的基本概念

SQL语句&#xff1a;1、数据查询语句 SELECT2、数据定义语句 DDL 定义表、视图、索引3、数据操纵语句 DML INSERT、UPDATE、DELETE4、数据控制语句 DCL基本的数据类型&#xff1a;number(p,s) --> p个数字&#xff0c;s是p中小数点后的数字位数smal…

移动端单位解析

手机端开发单位到底用什么&#xff1f; 目前有3种&#xff0c;px&#xff0c;em &#xff0c;rem PC端大部份是用px单位&#xff0c;小部分用em单位&#xff0c;而移动端&#xff0c;请全部用rem单位吧。目前大部份设备&#xff0c;包括但不限于iOS 5、Android 2.3、Window Pho…

oracle fiscal year,Version 0 is not defined for fiscal year 2007.

最初由 itpuber.net 发布[B]select version "0" maintain "setting for each fiscal year", try it [/B]but when i maintain versionActivation of the indicator is not permittedMessage no. KT253DiagnosisYou activated an indicator (Plan, Actual, …

CCNA training notes

5/29: vlan&#xff1a;virtual lan, 通过PVID来将物理上连通的host/PC划分到不同的局域网。switch的每个port有access与trunk两种mode&#xff0c;trunk模式的port属于所有vlan&#xff08;所有vlan的消息都能被转发&#xff09;。某个vlan的路径上的所有switch都要有该valn&a…

php js下拉框与文本联动,php mysql js 下拉框 二级联动

JS代码function changeappid(){var appiddocument.getElementById("appid").value;$result TSMLDB::getInstance()->select_sql("select f.appid,t.ftypeid,t.typename from wfappform f join wfformtype t on f.ftypeidt.ftypeid");$apptype array()…

SRS文档

负责人&#xff1a;韩朝燕 1什么是用例&#xff1f; 在介始用例方法之前&#xff0c;我们首先来看一下传统的需求表述方式-"软件需求规约"(Software Requirement Specification)。传统的软件需求规约基本上采用的是功能分解的方式来描述系统功能&#xff0c;在这种表…

automapper的简单用法

AutoMapper对象转换方面&#xff08;Object-Object Mapping&#xff09;对象映射工具&#xff0c;实现对象和对象之间的转化。主要应用在项目的dto&#xff0c;model&#xff0c;entity或viewmodel之间转换&#xff0c;其实AutoMapper涵盖所有对象&#xff08;Object&#xff0…

linux重启网卡的命令行,linux系统重启网卡命令

关于win10系统开机总是要禁用重启网卡才能联网如何解决就为大家介绍到这边了&#xff0c;有遇到同样情况的用户们可以采取上面的方法步骤来解决。问题2已知win7下不需要删除qos协议&#xff0c;在跑无盘模式下以前最好不要安装厂商网卡驱动或修改win7网络协议种类&#xff0c;某…

TMemo的ScrollBars属性和大文本

给TMemo.Text : 几M大的文本; 如果 ScrollBars 不是 sbBoth的话&#xff0c;程序很可能 无响应。 今天郁闷了半天才发现的。 转载于:https://www.cnblogs.com/CodeGear/p/4542587.html

JS判断客户端是否是iOS或者Android

<script type"text/javascript"> var u navigator.userAgent, app navigator.appVersion; var isAndroid u.indexOf(Android) > -1 || u.indexOf(Linux) > -1; //android终端或者uc浏览器 var isiOS !!u.match(/\(i[^;];( U;)? CPU.Mac OS X/); //i…

linux nginx 缓存服务器,如何开启Nginx缓存

众所周知&#xff0c;Nginx是一个高性能的web服务器&#xff0c;尤其在高并发和处理静态页面的时候有先天的优势&#xff1b;很大一部分得益于缓存的开启&#xff0c;那么如何开启nginx的缓存呢。简单来说可以分两步&#xff1a;1.定义缓存存储目录并指定共享内存空间2.在locat…

在im4java中使用GraphicsMagick

1.定义操作和命令GMOperation op new GMOperation();GraphicsMagickCmd cmd new GraphicsMagickCmd("convert"); //convert说明你要做的是convert里面的操作或ConvertCmd cmd new ConvertCmd(true); //true说明你要用的是gm工具 2.缩放的参数说明op.resize(int wi…

linux 分步编译命令,GCC分步编译C++程序(汇总版)

通过前面几节的讲解&#xff0c;已经就 gcc(g)指令可用的 -E、-S、-c 以及 -o 选项的功能和用法做了详细的讲解。在此基础上&#xff0c;本节将对“如何分步编译C/C程序”这个问题做一个完整的解答。接下来&#xff0c;我将以 g 指令分别对 C 源程序做预处理、编译、汇编和链接…

linux 安装u盘软件,Universal USB Installer:帮你用U盘装Linux

近期&#xff0c;Linux系统U盘制作安装工具&#xff1a;Universal USB Installer迎来了v1.9.5.1版本&#xff0c;新版支持了OpenSuse 32/64bit系统平台&#xff0c;欢迎Linux桌面爱好者下载使用。Universal USB Installer工具&#xff0c;类似一款U盘制作工具&#xff0c;允许用…

lucene 高亮显示

原文地址&#xff1a; http://blog.csdn.net/javaman_chen/article/details/8224407 Lucene针对高亮显示功能提供了两种实现方式,分别是Highlighter和FastVectorHighlighter。 顾名思义&#xff0c;FastVectorHighlighter较Highlighter速度更快&#xff0c;功能也更强大&…

linux rsync 安装教程,linux下的rsync配置和使用教程

本试验的测试环境使用的系统是Redhat AS4(2台&#xff0c;一个服务端&#xff0c;一个客户端)rsync服务端的ip&#xff1a;192.168.23.102rsync客户端的ip&#xff1a;192.168.23.100&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&am…

u盘 轻量linux,3种方法来创建轻量、持久化的Xubuntu Linux USB系统盘

使用Universal USB Install创建持久化USB XUbuntu系统盘这个教程为你介绍如何使用Xubuntu Linux创建一个轻量并且持久化的Linux USB系统盘。译者注&#xff1a;持久化Linux USB系统盘(Persistent Linux USB drive)&#xff0c;安装在优盘的Linux系统&#xff0c;允许用户保存数…

linux u盘加载阵列卡驱动步骤,Linux U盘加载阵列卡驱动步骤

如果没有Linux的机器,可以使用安装光盘的Linux环境&#xff1a;将 U 盘完全慢速格式化&#xff0c;将驱动拷贝到U盘&#xff0c;将U盘插在服务器上&#xff0c;用Linux安装光盘第一张启动到图形安装界面&#xff0c;按Ctrl&#xff0b;Alt&#xff0b;F2切换到控制台。按F11调用…

linux 笔记本键盘灯驱动程序,安装和使用CKB Next在Linux上更改Corsair键盘背光设置...

本文介绍在Ubuntu、Debian、Arch Linux、Fedora、OpenSUSE系统下安装和使用CKB Next的方法&#xff0c;以在Linux系统上更改Corsair键盘背光设置。Corsair键盘非常适合在PC上进行游戏&#xff0c;特别是在夜间&#xff0c;因为它们具有出色的RGB背光功能&#xff0c;用户可以轻…

15.6.6-sql字符串组装技巧

组装sql字符串&#xff0c;丢给exec sp_executesql执行 exec sp_executesql Nexec sp_executesql Nselect * from TESTTEST.dbo.Employees where Titletitle, Ntitle varchar(30), titleEmployee 注意&#xff1a;这里是执行一个带有输入参数的sql语句&#xff0c;用两层exec s…