自定义View之自定义控件属性

在自定义一个View的时候,为了让View的功能变得强大点,往往我们需要支持自定义属性来支持显示界面中所需要的效果,比如说:android:textColor="#ffffff"这样定义一个属性,可支持显示不同颜色,那么我们在项目中要如何定义?

首先我们需要在res/values目录下新建个attrs的xml文件当然这个名字是可以自定义的,但是不能重复定义一个属性。

<declare-styleable name="myViewAttrs">
        <attr name="String" format="string"/>
        <attr name="Boolean" format="boolean"/>
        <attr name="Integer" format="integer"/>
        <attr name="Dimension" format="dimension"/>
        <attr name="Reference" format="reference"/>
        <attr name="Fraction" format="fraction"/>
    </declare-styleable>

其中得name字段表示的是自定义名称

format表示的属性类型可以为boolean, string, integer, dimension, float, reference, color, fraction, enum, flag及其混合。

(1) boolean表示布尔值,调用如 xx:attr1="false"

(2) integer表示整型,调用如 xx:attr1="1"

(3) dimension表示尺寸值,调用如 xx:attr1="42dp"

(4) float表示浮点型,调用如 xx:attr1="0.7"

(5) color表示颜色值,调用如 xx:attr1="#00FF00"

(6) string表示字符串,调用如 xx:attr1="#adbddd"

(7) reference表示参考某一资源id,调用如 xx:attr1 = "@drawable/图片ID"

(8) fraction表示百分数,调用如 xx:attr1="30%"

以上类型定义都为<attr name="attr1" format="xxxtype"/>

(9) enum表示枚举值,定义为

<attr name="enum_attr">
      <enum name="horizontal" value="0" />
      <enum name="vertical" value="1" />
</attr>

调用如 xx:attr1="horizontal"

(10) flag表示位或运算,定义为

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

调用如:xx:attr1="stateUnspecified | stateUnchanged | stateHidden"

(11) 混合类型,定义为

<declare-styleable name = "combine_type">
    <attr name = "background" format = "reference|color" />
</declare-styleable>

调用如 xx:attr1 = "@drawable/图片ID|#DDFF00"

定义完这么一个属性之后我们就可以在View中使用了,类似为:

TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.myViewAttrs);
		String name = ta.getString(R.styleable.myViewAttrs_String);
		boolean _boolean = ta.getBoolean(R.styleable.myViewAttrs_Boolean, false);
		int _integer = ta.getInt(R.styleable.myViewAttrs_Integer, -1);
		float _demension = ta.getDimension(R.styleable.myViewAttrs_Dimension, 0);
		int _reference = ta.getResourceId(R.styleable.myViewAttrs_Integer, -1);
		float _fraction = ta.getFraction(R.styleable.myViewAttrs_Fraction, 1, 1, 0);
		System.out.println("Name is = " + name);
		System.out.println("_boolean is = " + _boolean);
		System.out.println("_integer is = " + _integer);
		System.out.println("_demension is = " + _demension);
		System.out.println("_reference is = " + _reference);
		System.out.println("_fraction is = " + _fraction);
		ta.recycle();

是在View中通过context.obtainStyleAttributes方法读取每个属性的值,然后就可以在代码中使用这些自己定义好得属性控制界面显示效果。记得调用ta.recyle()来回收资源。

写好一个View之后我们就可以在xml文件中定义和使用这个View了,当然是把自定义得属性一起使用起来:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:neacy="http://schemas.android.com/apk/res/com.example.testattr"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.testattr.MainActivity" >

    <com.example.testattr.AttrView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        neacy:String="Hello World, 你好世界!"
        neacy:Boolean="true"
        neacy:Integer="17"
        neacy:Dimension="99dp"
        neacy:Reference="@drawable/ic_launcher"
        neacy:Fraction="50%" />

</RelativeLayout>

注意到

xmlns:neacy="http://schemas.android.com/apk/res/com.example.testattr"

其中得neacy字段可自行定义,值为http://schemas.android.com/apk/res/加当前应用的包名,然后就可以在对应的AttrView中定义这些属性。

时间: 2024-08-11 00:02:52

自定义View之自定义控件属性的相关文章

给自定义View添加xml属性

笔者之前已经写过了一些自定义View的文章,在此对其也就不从头说起了,如有兴趣的读者可以看一下笔者的前两篇文章. android 自定义view的使用(最佳demo--返回标题栏) android 自定义控件(底部icon点击效果) 笔者之前的文章中仅仅介绍了如何使用自定义View以及为什么要使用自定义View等等,但是在实际操作中,我们还是希望自定义View之后,直接能够在xml中就对其进行操作,如下图: 那么如何操作呢?主要是三个步骤: 1.自定义属性名称 2.将属性名称与控件关联 3.从第

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

昨日看到有人在知乎上问这3个琐碎的小知识点,今天索性就整理了一下,其实这些知识点并不难,但是很多开发者平时很少注意到这些, 导致的后果就是开发的时候 经常会被ide报错,开发效率很低,或者看开源代码的时候很多地方看不懂. 考虑到现在越来越多的人开发环境迁移到android studio,所以一切以android studio环境为准.和eclipse开发环境相比其实两者是差不多的, 偶有区别 主要也是android studio引入的gradle脚本造成差异. 首先来看看tools标签. 这个地

Android 自定义View(自定义控件)

一.创建一个控件类间接或者直接继承View类 二.创建自定义的样式属性放在attr.xml文件里面,如 <?xml version="1.0" encoding="utf-8"?> <resources> <attr name="titleText" format="string" /> <attr name="titleTextColor" format=&quo

Android自定义View——多边形网格属性图

多边形网格属性图 事先说明: 该View涉及到Path类的运用,如果对Path类不熟悉的,可以看http://blog.sina.com.cn/s/blog_4d9c3fec0102vyhs.html,这篇文章通熟易懂 该View还涉及到数学的Cos和Sin式子,也就是一些圆的基本知识,如果不了解的话请补补高中知识吧 效果图:     步骤一:分析变量信息 //-------------我们必须给的模拟数据------------- //n边形 private int n = 5; //文字 p

Android自定义view教程03---Android 属性动画 详解

1 package com.example.donghuatest; 2 3 import android.animation.ObjectAnimator; 4 import android.animation.PropertyValuesHolder; 5 import android.animation.ValueAnimator; 6 import android.animation.ValueAnimator.AnimatorUpdateListener; 7 import andro

android 自定义View过程解析

PS:本篇文章大多数翻译自github上一篇英文文章! 总所周知,安卓UI是基于View(屏幕上的单一节点)和ViewGroup(屏幕上节点的集合),在android中有很多widgets和layouts可以用于创建UI界面,比如最常见的View有Button,TextView等等,而最常见的布局也有RelativeLayout,LinearLayout等. 在一些应用中我们不得不自定义View去满足我们的需求,自定义View可以继承一个View或者已存在的子类去创建我们自己的自定义View,甚

Android之自定义View的实现

对于学习Android开发的小童鞋对于自定义View一定不会陌生,相信大家对它是又爱又恨,爱它可以跟随我们的心意设计出漂亮的效果:恨它想要完全流畅掌握,需要一定的功夫.对于初学者来说确实很不容易,网上有很多相关的博客文档之类的资料,但是往往对于初学者,只知拷贝修改,不理解其中的深意,最后还是无法更具自己的需要,进行自定义的开发,本篇我们就一同来了解下自定义View的神秘面纱. 开发自定义控件的步骤: 1.了解View的工作原理 2. 编写继承自View的子类 3. 为自定义View类增加属性 4

android 自定义View(1)

自定义View: 第一步:创建一个View的实现类, 创建构造器和重写onDraw() 和onMesure()等方法. TypedArray获取自定义View的属性的数组 context.obtainStyledAttributes(attrs, R.styleable.MyView); // 从数组中根据styleable中定义的对应属性的值 属性是自定义View的名+“-”+属性名===>MyView_textColor int textColor = array.getColor(R.st

128、View 绘制流程 &amp; 自定义View

记清楚函数调用的顺序才能准确地进行调用. 根据调用链,可将整个绘制过程分为三部分:Measure - Layout - Draw Measure 过程 1. 测量过程由上至下,在measure过程的最后,每个视图将存储自己的尺寸大小和测量规格. 2. measure过程会为一个View及其所有子节点的mMeasureWidth和mMeasuredHeight变量赋值, 该值可以通过getMeasuredWidth和getMeasuredHeight方法获得. 3. measure过程的核心方法: