【安卓笔记】带自定义属性的view控件

开发中经常需要自定义view控件或者组合控件,某些控件可能需要一些额外的配置。比如自定义一个标题栏,你可能需要根据不同尺寸的手机定制不同长度的标题栏,或者更常见的你需要配置标题栏的背景,这时候,你就会考虑到你写的view的扩展性问题,通常情况下,我们可以为这个自定义的标题栏加上一些setXXX方法,供外界调用,设置其颜色、长度等属性。但是我们都知道,在使用系统控件时,我们大多数情况下并不需要在代码中配置控件,而仅仅只需在布局文件中对控件宽、高、颜色等进行配置,这样做的好处就将UI与业务逻辑解耦,使代码更加清晰

自定义带属性的view控件在实现上非常简单,下面介绍步骤:

1.编写attrs属性文件。android在默认情况下并没有attrs.xml,我们需要手动在values目录下新建一个这样的文件。文件根结点是resources,子节点叫declare-styleable,比如下面就是一个attrs文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="myview">
        <attr name="radius" format="integer"></attr>
        <attr name="color" format="color"></attr>
    </declare-styleable>
</resources>

这个属性文件提供了一个叫myview的属性集,里面有两个属性,一个是integer类型的radius(半径),另一个是color类型的color,这两个属性将来在自定义view中要使用。

2.编写自定义view。

这个想必大家都不陌生,我这里就来一个最简单的自定义view,画圆。

package com.example.attributedemo;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.view.View;
public class MyView extends View
{
	private Paint mPaint = null;

	/**
	 * 圆颜色
	 */
	private int mColor;
	/**
	 * 圆半径
	 */
	private int mRadius;

	/**
	 * 默认颜色
	 */
	private static final int DEFAULT_COLOR = Color.RED;
	/**
	 * 默认半径
	 */
	private static final int DEFAULT_RADIUS = 50;

	public MyView(Context context)
	{
		super(context);
		mColor = DEFAULT_COLOR;
		mRadius = DEFAULT_RADIUS;
		init();
	}
	public MyView(Context context, AttributeSet attrs)
	{
		super(context, attrs, 0);
		getConfig(context, attrs);
		init();
	}
	/**
	 * 初始化画笔
	 */
	private void init()
	{
		mPaint = new Paint();
		mPaint.setStrokeWidth(1);
		mPaint.setStyle(Style.FILL);

		mPaint.setColor(mColor);
	}

	/**
	 * 从xml中获取配置信息
	 */
	private void getConfig(Context context,AttributeSet attrs)
	{
		//TypedArray是一个数组容器用于存放属性值
		TypedArray ta = context.obtainStyledAttributes(attrs,R.styleable.myview);

		mRadius = ta.getInt(R.styleable.myview_radius, DEFAULT_RADIUS);
		mColor = ta.getColor(R.styleable.myview_color, DEFAULT_COLOR);
		//用完务必回收容器
		ta.recycle();
	}

	@Override
	protected void onDraw(Canvas canvas)
	{
		//画一个圆
		canvas.drawCircle(mRadius, mRadius, mRadius, mPaint);
	}
}

这里面的逻辑非常简单,需要注意的是这个getConfig方法,这个方法内部通过context和AttributeSet构造了一个TypedArray对象,这是个数组容器,里面存放的就是自定义属性和对应的值。该对象向外界暴露了一系列get方法,用于获取不同类型的属性值。TypedArray用完之后务必回收

3.编写布局文件,使用上面的自定义的view。

RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:myview="http://schemas.android.com/apk/res/com.example.attributedemo"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <com.example.attributedemo.MyView
        android:layout_width="200dp"
        android:layout_height="200dp"
        myview:radius="40"
        myview:color="#bc9300" />
</RelativeLayout>

需要注意的是,要想使用自定义属性,必须先加上命名空间,否则android不认识这些自定义属性。命名控件一般规则是  xmlns:[attrs中declare-styleable的name] =
"http://schemas.android.com/apk/res/包名",

4.在activity中通过setContentView找到布局。

显示效果:

【安卓笔记】带自定义属性的view控件

时间: 2024-08-09 00:44:35

【安卓笔记】带自定义属性的view控件的相关文章

IOS中Table View控件练习

之前两篇博客简单学习了Picker view控件的使用,接下来再学习IOS应用中很重要的一个视图--表视图. 在表视图中,每个表视图都是UITableView的一个实例,每个可见行都是UITableViewCell的一个实例. 表视图有两种基本格式,分组的表和普通表,普通表可以实现索引,实现了索引的表成为索引表.(PS.技术上,分组表也可以实现索引,不过好像苹果的设计规范中不支持) 一个简单的表视图应用 界面设计: 向storyboard中拖一个table view控件,他会自动占满屏幕,至于约

Picker View控件:

Picker View控件: 中文:单滚轮选择器 自定义选择器需要遵守两个协议:数据源协议和委托协议 UIPickerView有一个实例方法selectRow:(NSInteger)inComponent:(NSInteger)animated:(BOOL),以编程的方式来选择值. UIPickerView必须用代码实现一些协议才能正常显示,而且无法在Attributes Inspector(属性检查)中配置选择器视图的外观 1. 数据源协议 数据源协议(UIPickerViewDataSour

Android 自定义View修炼-打造完美的自定义侧滑菜单/侧滑View控件(转)

一.概述 在App中,经常会出现侧滑菜单,侧滑滑出View等效果,虽然说Android有很多第三方开源库,但是实际上 咱们可以自己也写一个自定义的侧滑View控件,其实不难,主要涉及到以下几个要点: 1.对Android中Window类中的DecorView有所了解 2.对Scroller类实现平滑移动效果 3.自定义ViewGroup的实现 首先来看看效果图吧:    下面现在就来说说这里咱们实现侧滑View的基本思路吧,这里我采用的是自定义一个继承于RelativeLayout的控件叫做XC

xcode中用oc代码基本控制view控件

控件代码部分: 编译运行后的结果为: 复杂一点的: 结果为: xcode中用oc代码基本控制view控件,布布扣,bubuko.com

WPF笔记(1.9 样式和控件模板)——Hello,WPF!

原文:WPF笔记(1.9 样式和控件模板)--Hello,WPF! 资源的另一个用途是样式设置: <Window >  <Window.Resources>    <Style x:Key="myStyle" TargetType="{x:Type TextBlock}">      <Setter Property="VerticalAlignment" Value="Center"

C# 带滚动条的Label控件

C# 带滚动条的Label控件,用鼠标选的时候还是有点闪烁: namespace 带滚动条的Label控件 { public class TextBoxLabel : System.Windows.Forms.TextBox { [DllImport("user32", EntryPoint = "HideCaret")] private static extern bool HideCaret(IntPtr hWnd); [DllImport("user

前端笔记——如何控制表单控件中的disabled

0.前言 本文主要说明如何使能或禁止表单控件.表单控件具有disabled属性,通过设置该属性可以禁止所有的input控件,input的更多属性请参考资料[1].下面就通过一个简单的例子说明如何设置和读取disabled属性. [示例页面--代码] <!DOCTYPE html> <html> <head> <script src="jquery.js"></script> <meta charset="utf

Silverlight学习笔记(三):控件布局管理

简介: 学习Silverlight控件在页面上是如何进行布局,实现多种复杂布局 一.常见的三种布局方式 1. Silverlight学习笔记(三):控件布局管理,码迷,mamicode.com

iOS开发UI篇—使用picker View控件完成一个简单的选餐应用 - 文顶顶

原文  http://www.cnblogs.com/wendingding/p/3771047.html iOS开发UI篇—使用picker View控件完成一个简单的选餐应用 一.实现效果 说明: 点击随机按钮,能够自动选取,下方数据自动刷新. 二.实现思路 1.picker view的有默认高度为162,不可修改. 2.显示数据,需要设置数据源,也有两种方式(成为数据源,遵守协议) 3.实现数据源里面的两个方法 1)返回一共有多少列 2)在这一列中一共有多少行 4.通过代理告诉它那一列的哪