有时候android传统的页面布局不足以满足我们的需求,常常需要自己定义view,通常继承View,然后重写构造方法以及onDraw等函数,再具体实现自己定义的复杂view。我们知道在给控件赋属性时,通常使用的是android系统自带的属性,比如 android:layout_height="wrap_content",除此之外,我们亦可以自己定义属性,这样在使用的时候我们就可以使用形如
myapp:myTextSize="20sp"的方式了,步骤大致如下:
1》在项目文件res/value下面创建一个attr.xml文件,该文件中包含若干个attr集合,例如:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyView">
<attr name="myTextSize" format="dimension"/>
<attr name="myColor" format="color"/>
</declare-styleable>
</resources>
其中resource是跟标签,可以在里面定义若干个declare-styleable,<declare-styleable name="MyView">中name定义了变量的名称,下面可以再自定义多个属性,针对<attr name="myTextSize" format="dimension"/>来说,其属性的名称为"myTextSize",format指定了该属性类型为dimension,只能表示字体的大小。
format还可以指定其他的类型比如;
reference 表示引用,参考某一资源ID
string 表示字符串
color 表示颜色值
dimension 表示尺寸值
boolean 表示布尔值
integer 表示整型值
float 表示浮点值
fraction 表示百分数
enum 表示枚举值
flag 表示位运算
2》在使用到该自定义view的布局文件中键入如下的一行:
xmlns:myapp=http://schemas.android.com/apk/res/com.eyu.attrtextdemo绿色是自己定义属性的前缀名字,粉色是项目的包名,这样一来,在我们自己定义的view的属性中,就可以使用自己在attr中定义的属性啦,例如:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:myapp="http://schemas.android.com/apk/res/com.eyu.attrtextdemo"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<com.eyu.attrtextdemo.MyView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
myapp:myTextSize="20sp"
myapp:myColor="#324243"/>
</LinearLayout>
3》在自定义view的代码中引入自定义属性,修改构造函数
context通过调用obtainStyledAttributes方法来获取一个TypeArray,然后由该TypeArray来对属性进行设置
obtainStyledAttributes方法有三个,我们最常用的是有一个参数的obtainStyledAttributes(int[] attrs),其参数直接styleable中获得
TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.MyView);
调用结束后务必调用recycle()方法,否则这次的设定会对下次的使用造成影响
具体如下:
package com.eyu.attrtextdemo;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.view.View;
public class MyView extends View{
public Paint paint;
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
paint = new Paint();
TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.MyView);
int textColor = a.getColor(R.styleable.MyView_myColor, 003344);
float textSize = a.getDimension(R.styleable.MyView_myTextSize, 33);
paint.setTextSize(textSize);
paint.setColor(textColor);
a.recycle();
}
public MyView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
paint.setStyle(Style.FILL);
canvas.drawText("aaaaaaa", 10, 50, paint);
}
}
运行后:
分享到:
相关推荐
总结,通过上述三种方法,我们可以轻松地在Android中创建并使用自定义属性。这不仅增强了组件的灵活性,还使得代码更具可维护性和复用性。通过`Custom_TextView`这个例子,我们可以看到自定义属性如何与自定义View...
本文将深入探讨Android自定义属性的创建、使用以及它们在实际项目中的应用。 首先,我们来了解自定义属性的定义。在Android中,自定义属性通常在资源XML文件的`<declare-styleable>`元素中定义。例如,假设我们要为...
在Android开发中,自定义控件是提升应用可定制性和扩展性的重要手段。自定义控件的属性定义和使用涉及到`TypedArray`和`attrs`...理解并熟练掌握`attrs`和`TypedArray`的使用,对于深入Android自定义控件开发至关重要。
2. **在布局文件中使用**:在XML布局文件中,使用`app:`前缀(对于AndroidX库)或`@namespace/`(对于Support Library)指定自定义命名空间,并引用自定义属性。 ```xml android:layout_width="wrap_content" ...
在Android开发中,有时我们需要对系统提供的控件进行扩展,以满足特定的需求,这就涉及到控件的重写和自定义属性的添加。本篇将详细讲解如何在Android中实现这一功能。 首先,我们要理解Android控件重写的基本原理...
在Android开发中,自定义属性是提升应用独特性和用户体验的重要手段。本教程将详细讲解如何通过自定义属性来实现ImageView的透明度渐变效果。首先,我们从自定义属性的创建开始。 一、创建自定义属性 在Android项目...
总结起来,创建和使用Android自定义属性包括以下几个步骤: 1. 在`res/values/attrs.xml`中定义自定义属性。 2. 在自定义视图类中解析并使用这些属性。 3. 在布局文件中使用自定义属性。 4. 在`AndroidManifest.xml`...
在Android开发中,自定义属性(attr.xml, TypedArray)是一种强大的工具,它允许开发者扩展Android组件的功能,创建个性化的UI元素,同时提高代码的可重用性和可配置性。以下将详细介绍如何在Android中使用自定义...
本篇文章将深入探讨如何在Android中进行自定义View,并以"自定义属性demo修改版"为例,讲解如何添加和使用自定义属性。 首先,自定义属性是在Android资源文件中定义的,通常在res/values/attrs.xml中。在这个示例中...
本DEMO,"Android自定义菜单属性DEMO",旨在教你如何为Android应用创建一个带有自定义属性的菜单按钮。这个教程是基于CSDN博主janice0529的一篇博客文章,你可以通过提供的链接获取详细的源码解析。 首先,我们要...
总结一下,`attrs.xml`文件和`TypedArray`在Android自定义组件中起着至关重要的作用。它们允许开发者定义和获取自定义属性,使组件更具可配置性和可复用性。通过熟练掌握这两者,开发者可以更高效地创建出满足需求的...
在运行时,可以使用`setCustomAttribute`方法动态地修改自定义属性。例如: ```java myView.setCustomAttribute("custom_color", "#FF0000"); // 设置红色 myView.setCustomAttribute("custom_text", "动态更新的...
以下将详细介绍Android自定义Attr属性的使用过程及其背后的原理。 首先,自定义Attr涉及到的主要步骤包括:定义属性、在资源文件中声明属性、解析属性值以及在代码中使用属性。让我们逐一探讨这些步骤: 1. **定义...
自定义属性的使用使得我们的控件更具可配置性,可以根据不同的应用场景进行调整。同时,自定义控件能够封装复杂逻辑,降低代码耦合,提高代码质量。通过学习和熟练掌握自定义控件及属性的创建,开发者可以更好地应对...
以上内容涵盖了Android自定义属性控件的基本实现,包括自定义属性、自定义控件的绘制与交互,以及简单的Tab控件封装。通过这些技术,开发者可以构建出功能强大且具有个性化风格的Android应用。在实际项目中,还需要...
在构造函数或`onFinishInflate()`方法中,可以使用`TypedArray`来获取XML布局中设置的自定义属性值: ```java public CustomView(Context context, AttributeSet attrs) { super(context, attrs); init(attrs); }...
在Android开发中,自定义控件和自定义属性是提升应用独特性和功能扩展性的重要手段。自定义控件允许开发者根据需求创建具有特定功能或视觉效果的组件,而自定义属性则能让这些控件更加灵活,能够适应各种场景。下面...
在自定义View时,我们通常会在XML布局文件中定义一些自定义属性,这些属性可以是颜色、尺寸、字符串、图片资源等。例如,在本例中,我们创建了一个名为ExpandTextView的自定义TextView,它支持扩展和收缩的功能。...
通过理解源码、声明自定义属性、合理布局以及使用工具进行调试和优化,开发者可以打造出极具个性化的Android应用。在实际项目中,恰当运用自定义View和Layout,不仅可以提升用户体验,还能提高代码的可维护性和复用...