编写Android自定义按钮示例基础上,如果要指定字体大小产生这样的效果:

其实是不需要自定义变量的,可以直接使用TextView的配置属性:

<com.easymorse.textbutton.TextButton
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:layout_weight="1" android:text="电影"
    android:gravity="center_vertical|center_horizontal"
    android:background="@drawable/button" android:focusable="true"
    android:clickable="true" android:textSize="22sp" />

在这里字体大小使用了sp,这里要说一下sp与dp(dip)的区别,dip是:

dp Density-independent Pixels – an abstract unit
that is based on the physical density of the screen. These units are
relative to a 160 dpi screen, so one dp is one pixel on a 160 dpi
screen. The ratio of dp-to-pixel will change with the
screen density, but not necessarily in direct proportion. Note: The
compiler accepts both "dip" and "dp", though "dp" is more consistent
with "sp".

不过,要是和字体有关,最好还是用sp,和dp类似,但更适合字体大小:

sp Scale-independent Pixels – this is like the dp
unit, but it is also scaled by the user’s font size preference. It is
recommend you use this unit when specifying font sizes, so they will be
adjusted for both the screen density and user’s
preference.

这里为了演示使用自定义变量,字体大小改用自定义的属性。

首先要创建变量,创建了个values/attrs.xml文件,文件名任意,但是要在values目录下:

<?xml version="1.0" encoding="utf-8"?>  
<resources>  
    <declare-styleable name="button">  
        <attr name="textSize" format="dimension" />  
    </declare-styleable>  
</resources>

根标签要是resources,定义的变量要有个名字,declare-styleable
name="button">,这里定义名称为button。在这个名称里,可以有多个自定义属性。定义了个名为textSize的属性,格式是
dimension,这个format指定了textSize属性的类型,只能用于定义字体大小。

在布局文件中通过自定义属性赋值:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:myapp="http://schemas.android.com/apk/res/com.easymorse.textbutton"

    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent" android:background="@drawable/background_color">

    <LinearLayout android:layout_width="fill_parent"
        android:layout_height="10dip" />
    <LinearLayout android:layout_width="fill_parent"
        android:layout_height="40dip">
        <com.easymorse.textbutton.TextButton
            android:layout_width="fill_parent" android:layout_height="fill_parent"

            android:layout_weight="1" android:text="电影"
            android:gravity="center_vertical|center_horizontal"
            android:background="@drawable/button" android:focusable="true"
            android:clickable="true" myapp:textSize="20sp" />

这里在根标签中增加了:

xmlns:myapp=http://schemas.android.com/apk/res/com.easymorse.textbutton

声明了myapp这个名字空间,myapp是任意的名称,自己可以随便起名,后面的:

http://schemas.android.com/apk/res/

是固定的。再后面接的是应用的包名。

在下面自定义按钮中的:myapp:textSize,就是使用<attr name="textSize"这个变量了,给变量赋值。

还需要一个过程,就是在程序中获取到这个赋值:

public TextButton(final Context context, AttributeSet attrs) {
    this(context, attrs, 0);
    TypedArray typedArray=context.obtainStyledAttributes(attrs, R.styleable.button);

    this.setTextSize(typedArray.getDimension(R.styleable.button_textSize, 15));
    typedArray.recycle();

其中,TypedArray实例是个属性的容器,context.obtainStyledAttributes()方法返回得到。
AttributeSet是节点的属性集合,在本例中是<com.easymorse.textbutton.TextButton节点中的属性集
合。

这句话:

typedArray.getDimension(R.styleable.button_textSize,
                15)

将获取自定义textSize的值,如果没有,则使用默认的值,15。

最后别忘记调用:

typedArray.recycle();

作用是:

Give back a previously retrieved StyledAttributes, for later re-use.

这里的自定义属性的format,可以有很多种:

  • reference
  • string
  • color
  • dimension
  • boolean
  • integer
  • float
  • fraction
  • enum
  • flag

TypedArray和obtainStyledAttributes使用的更多相关文章

  1. 【Android】TypedArray和obtainStyledAttributes使用

    在编写Android自定义按钮示例基础上,如果要指定字体大小产生这样的效果: 其实是不需要自定义变量的,可以直接使用TextView的配置属性: <com.easymorse.textbutto ...

  2. Android开发学习之TypedArray类

    在学习Android的开发中,学习Gallery视图显示图片的过程中,在设置图片适配器的时候,用到了此TypedArray类型,这次根据android SDK,一块把此类型弄清楚! android.c ...

  3. Android - 自定义控件和属性(attr和TypedArray)

    http://blog.csdn.net/zjh_1110120/article/details/50976027 1.attr format 取值类型 以ShapeView 为例 <decla ...

  4. android绘制圆形图片的两种方式

    看下效果先 下面有完整的示例代码 使用BitmapShader(着色器) 我们在绘制view 的时候 就是小学上美术课 用水彩笔在本子上画画 使用着色器绘制圆形图片最简单的理解方式 就是把bitmap ...

  5. Android自定义控件之自定义属性

    前言: 上篇介绍了自定义控件的基本要求以及绘制的基本原理,本篇文章主要介绍如何给自定义控件自定义一些属性.本篇文章将继续以上篇文章自定义圆形百分比为例进行讲解.有关原理知识请参考Android自定义控 ...

  6. android图片验证码--自绘控件

    自绘控件的内容都是自己绘制出来的 大致流程如下: 1.定义一个类继承view 使用TypedArray初始化属性集合 在view的构造方法中 有一个AttributeSet的参数 很明显是用来保存控件 ...

  7. Andriod 自定义控件之创建可以复用的组合控件

    前面已学习了一种自定义控件的实现,是Andriod 自定义控件之音频条,还没学习的同学可以学习下,学习了的同学也要去温习下,一定要自己完全的掌握了,再继续学习,贪多嚼不烂可不是好的学习方法,我们争取学 ...

  8. Android中自定义控件TextSize属性问题

    本文主要说明一个自定义控件添加TextSize属性的坑,刚刚从坑里面爬出来,写个随笔,记录一下: *************************************************** ...

  9. Android自定义属性

    上一篇讲解了Android自定义View,这篇来讲解一下Android自定义属性的使用,让你get新技能.希望我的分享能帮助到大家. 做Android布局是件很享受的事,这得益于他良好的xml方式.使 ...

随机推荐

  1. Android Studio中常用设置与快捷键

    常用设置: 1.Tab不用4个空格Code Style->Java->Tabs and Indents->Use tab characterCode Style->Genera ...

  2. Android开发手记(8) ProgressDialog的使用

    ProgressDialog,进度对话框.一般有两种,一种是圆形的进度条(ProgressDialog.STYLE_SPINNER),另一种是长条形的进度条(ProgressDialog.STYLE_ ...

  3. 3.3.2 嵌入汇编(摘自<linux内核完全剖析>)

    内核C语言程序嵌入式汇编代码又叫内联汇编,具有输入和输出参数的嵌入汇编语句的基本格式为: ************************************************** asm( ...

  4. symfony框架在中国移动cmwap网络下访问的问题

    最近用symfony框架给手机app做后台,发现在中国移动cmwap网络下会出现问题,所有请求都路由到根路径了 左图为原始$_SERVER对象,右图为$request->server对象由于re ...

  5. 自定义cell 自适应高度

    #pragma mark - 动态计算cell高度 //计算 返回 文本高度 + (CGFloat)calsLabelHeightWithContact:(Contacts *)contact { / ...

  6. 07 - 删除vtkDataObject中的SetExtentTranslator 和 GetExtentTranslator方法 VTK 6.0 迁移

    VTK6 引入了许多不兼容的变.其中之一是删除vtkDataObject中所有有关管道的方法.其中的两个方法就是SetExtentTranslator() 和 GetExtentTranslator( ...

  7. ural 1180 Stone Game

    http://acm.timus.ru/problem.aspx?space=1&num=1180 #include <cstdio> #include <cstring&g ...

  8. Android——在活动中使用Menu

    ADT在HelloWorldActivity中自动创建了一个onCreateOptionsMenu()方法.这个方法是用于在活动中创建菜单的,现在我们来仔细分析一下了.手机毕竟和电脑不同,它的屏幕空间 ...

  9. Matrix控制平移、旋转和缩放的方法

    1.setTranslate(float ds,float dy):控制Matrix进行平移.2.setSkew(float kx,float ky,float px,float py):控制Matr ...

  10. Android Canvas.drawText方法中的坐标参数的正确解释

    摘要 canvas.drawText(www.jcodecraeer.com, x, y, paint); x和y参数是指定字符串中心的坐标吗?还是左上角的坐标?这个问题的直观印象应该是左上角的坐标, ...