android 自定义View属性

在android开发过程中,用到系统的View时候可以通过XML来定义一些View的属性。比如ImageView:

android:src  和android:scaleType为ImageView指定了图片源和图片缩放类型。

其实我们也可以自定义图片的这种属性。

下面以自定义标题栏为例,简单说明下自定义View属性。

比如在项目中,经常会用到标题栏,左边是返回,中间是标题,右边是下一步。如下图:

如果,每一次用到标题都在XML里面进行布局,那就太麻烦了。我们可以自定义一个标题栏。

自定义View的方式基本有三种:

1,继承View类,比如 View ImageView。

2,组合的方式,就是把已知的多个View组合在一起。也是通过继承其中一个View,用动态加载的方式,把其他View组合到一起。

3,继承ViewGroup类,比如我们熟悉的五大布局,ViewPager等。

我们使用第二种,组合的方式。

在构造函数中,动态的把标题栏的xml文件加载进去。

common_title.xml:

xml version="1.0" encoding ="utf-8" ?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width= "fill_parent"
    android:layout_height= "match_parent"
    android:layout_gravity= "center"
    android:background= "#123456" >

    <LinearLayout
        android:id="@+id/left_ll"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:gravity="center_vertical|left"
        android:orientation="horizontal" >

        <ImageView
            android:id="@+id/left_iv"
            android:layout_width="25dip"
            android:layout_height="match_parent"
            android:src="@drawable/back"
            android:layout_marginLeft="10dip" />

        < TextView
            android:id="@+id/left_tv"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginLeft="10dip"
            android:gravity="center_vertical"
            android:textColor="#ffffff"
            android:text="返回"
            android:textSize="16sp" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/right_ll"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentRight="true"
        android:orientation="horizontal" >

        <ImageView
            android:id="@+id/right_iv"
            android:layout_width="25dip"
            android:layout_height="match_parent"
            android:src="@drawable/next"
            android:layout_marginLeft="10dip" />

        < TextView
            android:id="@+id/right_tv"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginLeft="10dip"
            android:gravity="center_vertical"
            android:textColor="#ffffff"
            android:text="下一步"
            android:textSize="16sp" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/middle_ll"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_toLeftOf="@id/right_ll"
        android:layout_toRightOf="@id/left_ll"
        android:gravity="center_horizontal"
        android:orientation="horizontal" >

        < TextView
            android:id="@+id/middle_tv"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="我是标题"
            android:gravity="center_vertical"
            android:textColor="#ffffff"
            android:textSize="16sp" />

            <ImageView
            android:id="@+id/middle_iv"
            android:layout_width="25dip"
            android:layout_height="match_parent"
            android:src="@drawable/click_down"
             />
    </LinearLayout>

</RelativeLayout>
 

<?

OK,现在CommmTitleView已经是有界面的View了,我们在XML中直接使用可以使用了。

图中,my: 开头的就是自定义属性,我定义了CommonTitleView的左边图片,左边文字,右边图片等。接下来就接着讲如何实现。

首先要在value文件夹下建立attr.xml:

<?xml version="1.0" encoding ="utf-8" ?>
<resources>

    <declare-styleable name= "CommonTitleView">
        < attr name= "leftTv" format ="integer" />
        < attr name= "leftIv" format ="integer" />
        < attr name= "rightTv" format ="integer" />
        < attr name= "rightIv" format ="integer" />
        < attr name= "middleTv" format ="integer" />
        < attr name= "middleIv" format ="integer" />
    </declare-styleable>

</resources>

这个文件声明了有哪些自定义属性。其中 attr:name 是自定义属性的名称,format后面是该属性的类型。

format属性有:

reference   表示引用,参考某一资源ID

string   表示字符串

color   表示颜色值

dimension   表示尺寸值

boolean   表示布尔值

integer   表示整型值

float   表示浮点值

fraction   表示百分数

enum   表示枚举值

flag   表示位运算

attr.xml就是声明了这个View有哪些属性,属性名称是什么,属性类型是什么。

然后,在声明下命名空间,就可以使用自己定义的这些属性了。

第一行,是系统的命名空间。

第二行,xmlns:my就是我们APP自身的命名空间。声明后,就可以使用我们在attr.xml中声明的属性了。

那么,在XML中声明这些属性后,如何让CommonTitleView知道我们声明了哪些属性呢?

这就需要在CommontitleView,构造函数中,获取这些属性,然后根据获取的属性值,做出处理。如下图:

在构造函数中,我们使用TypedArray把在xml文件中声明的属性装起来。关于TypedArray的介绍,源码里面很简单:就是装属性的容器。

然后依次,通过我们在attr.xml中设置的属性名称,获取对应的值。

比如,xml中写的是my:leftIv="@drawble/back"

在构造函数中通过

int resouce_left_iv = typedArray.getResourceId ( R.styleable.CommonTitleView_leftIv, 0);

得到资源文件back图片的资源ID。

R. styleable .CommonTitleView_leftIv的意思就是名称为CommonTitleView的leftIv属性。

那么,resouce_left_iv 就是图片back对应的资源ID.

其他的属性都是通过上述方法添加进去的,比如文字等。

拿到资源ID后,就可以把资源设置到定义的View中。

这样,我们自定义的标题栏就OK了。

除此之外,还可以为标题栏中的返回,下一步等设置监听。

还可以定义接口,在外部使用的时候动态的来设定标题栏中的内容:

下面是在Activity中使用的例子:

现在main.xml中定义

在Activity中自由的设置监听:

最后附上源码:http://pan.baidu.com/s/1ntxiPTn

时间: 2024-11-07 08:39:52

android 自定义View属性的相关文章

android 自定义view+属性动画实现充电进度条

近期项目中需要使用到一种类似手机电池充电进度的动画效果,以前没学属性动画的时候,是用图片+定时器的方式来完成的,最近一直在学习动画这一块,再加上复习一下自定义view的相关知识点,所以打算用属性动画和自定义view的方式来完成这个功能,将它开源出来,供有需要的人了解一下相关的内容. 本次实现的功能类似下面的效果: 接下来便详细解析一下如何完成这个功能,了解其中的原理,这样就能举一反三,实现其他类似的动画效果了. 详细代码请看大屏幕 https://github.com/crazyandcoder

Android自定义 view属性

第一种 /MainActivity/res/values/attrs.xml   <?xml version="1.0" encoding="utf-8"?><resources> <declare-styleable name="MyCircle"> <attr name="radius" format="integer"/> <attr name=&

android自定义view属性

方法一: MyView.class package com.bwie.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.View; public class MyView ext

Android 自定义View、ViewGroup和自定义属性

一.Android自定义view属性 1.在res/values/styles.xml文件里面声明一个我们自定义的属性: <resources> <!--name为声明的"属性集合"名,可以随便取,但是最好是设置为跟我们的View一样的名称--> <declare-styleable name="CircleView"> <!--声明我们的属性,名称为default_size,取值类型为尺寸类型(dp,px等)-->

【android自定义控件】自定义View属性

1.自定义View的属性 2.在View的构造方法中获得我们自定义的属性 3.重写onMesure 4.重写onDraw 3这个步骤不是必须,当然了大部分情况下还是需要重写的. 1.自定义View的属性,首先在res/values/  下建立一个attrs.xml , 在里面定义我们的属性和声明我们的整个样式. <?xml version="1.0" encoding="utf-8"?> <resources> <attr name=&

UI--从学习styleable自定义view属性到一点儿更有意思的尝试

<代码里的世界> -UI篇 用文字札记描绘自己 android学习之路 转载请保留出处 by Qiao http://blog.csdn.net/qiaoidea/article/details/45599593 [导航] - 多行文本折叠展开 自定义布局View实现多行文本折叠和展开 1.概述 前面封装view的时候用到了自定义属性,觉得有必要单独讲一下这部分,但是呢,又不想向其他文章一样千篇一律地写这些东西.所以呢,后便会加一些临时的发散思维,引用点有意思的东西.分享东西嘛,随性点儿. 回

(转)[原] Android 自定义View 密码框 例子

遵从准则 暴露您view中所有影响可见外观的属性或者行为. 通过XML添加和设置样式 通过元素的属性来控制其外观和行为,支持和重要事件交流的事件监听器 详细步骤见:Android 自定义View步骤 样子 支持的样式 可以通过XML定义影响外边和行为的属性如下 边框圆角值,边框颜色,分割线颜色,边框宽度,密码长度,密码大小,密码颜色 <declare-styleable name="PasswordInputView"> <attr name="border

Android自定义View——圆形进度条式按钮

介绍 今天上班的时候有个哥们问我怎么去实现一个按钮式的进度条,先来看看他需要实现的效果图. 和普通的圆形进度条类似,只是中间的地方有两个状态表示,未开始,暂停状态.而且他说圆形进度的功能已经实现了.那么我们只需要对中间的两个状态做处理就行了. 先来看看实现的效果图: 上面说了我们只需要处理中间状态的变化就可以了,对于进度的处理直接使用了弘洋文章中实现: http://blog.csdn.net/lmj623565791/article/details/43371299 下面开始具体实现. 具体实

Android自定义View(二、深入解析自定义属性)

转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51468648 本文出自:[openXu的博客] 目录: 为什么要自定义属性 怎样自定义属性 属性值的类型format 类中获取属性值 Attributeset和TypedArray以及declare-styleable ??在上一篇博客<Android自定义View(一.初体验)>中我们体验了自定义控件的基本流程: 继承View,覆盖构造方法 自定义属性 重写onMeasure方法测量宽