自定义view中自定义属性的用法.

有时候我们自定义的view需要用到有自己定义的属性。

首先定义自己的属性,在res/values/attrs.xml中定义,xml文件如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name = "myView">
        <attr name = "text" format = "string" />
        <attr name = "textSize" format = "dimension"/>
        <attr name = "textColor" format = "color"/>
        <attr name = "rectColor" format = "color"/>
    </declare-styleable>
</resources>

name属性很重要,关系到以后的调用。

format为属性的类型,这里列举了几种基本的数据类型,注意textSize等关系到大小的属性格式为dimension。

在布局文件中的使用。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:my="http://schemas.android.com/apk/res/com.example.myview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    >

    <com.example.myview.MyView
        android:layout_width="100dp"
        android:layout_height="100dp"
        my:text = "点击开始计数"
        my:textColor = "#ffff0000"
        my:textSize = "21sp"
        my:rectColor = "#ff00ff00"
        />

</RelativeLayout>

xmlns:my="http://schemas.android.com/apk/res/com.example.myview" 为使用

my字段调用自定义属性的关键代码。

使用my:XXX时并不会验证属性的正确性。

但是在自定义view代码中获取属性值的时候会进行验证。

获取属性值对自定view进行初始化。

//获取xml文件中的属性数组
	private void initAttrs(AttributeSet attrs) {
		mPanit = new Paint();
		mBound = new Rect();
		setOnClickListener(this);
		//和attr.xml中的属性列表对应上
		TypedArray ta = getContext().obtainStyledAttributes(attrs,R.styleable.myView);
		String text = ta.getString(R.styleable.myView_text);
		setText(text);
		int textSize = ta.getDimensionPixelOffset(R.styleable.myView_textSize, 26);
		setTextSize(textSize);
		int color = ta.getColor(R.styleable.myView_textColor, 0xff000000);
		setTextColor(color);
		int rectColor = ta.getColor(R.styleable.myView_rectColor, 0xff000000);
		setRectColor(rectColor);
		ta.recycle();
	}

AttributeSet attrs为xml中的属性和它所对应的值。

TypedArray ta = getContext().obtainStyledAttributes(attrs,R.styleable.myView);

只获取自定义属性名为myView中的属性。并且赋值给TypeArray ta。

之后便可根据 ta 获取获取对应的属性值了。

至于获取的属性值该怎么用,就要看你自己的了。

时间: 2024-10-05 07:21:48

自定义view中自定义属性的用法.的相关文章

Android 高手进阶之自定义View,自定义属性(带进度的圆形进度条)

转载请注明地址:http://blog.csdn.net/xiaanming/article/details/10298163 很多的时候,系统自带的View满足不了我们功能的需求,那么我们就需要自己来自定义一个能满足我们需求的View,自定义View我们需要先继承View,添加类的构造方法,重写父类View的一些方法,例如onDraw,为了我们自定义的View在一个项目中能够重用,有时候我们需要自定义其属性,举个很简单的例子,我在项目中的多个界面使用我自定义的View,每个界面该自定义View

Android查缺补漏(View篇)--自定义 View 中 wrap_content 无效的解决方案

自定义 View 中 wrap_content 无效的解决方案 做过自定义 View 的童鞋都会发现,直接继承 View 的自定义控件需要重写 onMeasure() 方法,并设置 wrap_content 时的自身大小,否在在布局文件中对自定义控件在设置大小时,wrap_content 将等同于 match_parent. 其实在 Android 中自带的控件中,也都对 onMeasure() 方法进行了重写,对于 wrap_content 等情况做了特殊处理,在 wrap_content 时

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

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

自定义view的自定义属性方法

一般自定义view以达到某些效果,复写onDraw()方法就行了.当我们需要动态地响应用户的操作且能像Android自带View那样直接操作属性就很方便了,为了达到这个目的,我们就可以使用自定义view属性的方法来对我们的自定义view进行动态响应了. 为了实现自定义的view的自定义属性,应该完成这四步: 为你的view在资源标签下定义自设的属性 在你的XML layout中指定属性值 在运行时获取属性值 把获取到的属性值应用在你的view上 step1: 在资源标签下定义自设的属性,放置于r

Android中实现Bitmap在自定义View中的放大与拖动

一:基本实现思路 基于View类实现自定义View –MyImageView类.在使用View的Activity类中完成OnTouchListener接口,实现对自定义View的触摸事件监听 放大与拖动 基于单点触控实现Bitmap对象在View上的拖动.并且检测View的边缘,防止拖动过界.基于两个点触控实现Bitmap对象在View上的放大.并且检测放大倍数.基于Matrix对象实现对Bitmap在View上放大与平移变换 Bitmap对象在View中的更新与显示 通过重载onDraw方法,

关于Android自定义View中的onTouchEvent(MotionEvent event)事件监听

今天做一个自定义ViewGroup,通过addView动态添加子控件,为了省事,直接在父控件里重写public boolean onTouchEvent(MotionEvent event){}方法来监听当前触碰是哪个按钮,遇到点问题,所以写下来. 首先是点击效果只有 MotionEvent.ACTION_DOWN,这个把返回改为return true;就行了 然后是 getX()和getRawX()的区别,这个这篇博文有写到 http://www.cnblogs.com/foura/artic

自定义View 中一些方法的调用时机

onFinishInflate()函数的调用时机: onFinishInflate() 当View中所有的子控件均被映射成xml后触发 onMeasure(int, int) 确定所有子元素的大小 onLayout(boolean, int, int, int, int) 当View分配所有的子元素的大小和位置时触发 onSizeChanged(int, int, int, int) 当view的大小发生变化时触发 onDraw(Canvas) view渲染内容的细节 onKeyDown(int

自定义View中为什么需要重写onMeasure()方法?

不实现OnMeasure()方法的时候 首先自定义一个简单的view: public class myView extends View { public myView(Context context) { super(context); } public myView(Context context, AttributeSet attrs) { super(context, attrs); } } 在布局中使用: <RelativeLayout xmlns:android="http:/

android 自定义view中findViewById为空的解决办法

网上说的都是在super(context, attrs);构造函数这里少加了一个字段, 其实根本不只这一个原因,属于view生命周期的应该知道,如果你在 自定义view的构造函数里面调用findViewById 铁定为空的,因为这个 时候view还在初始化阶段,还没有添加到activity的XML布局上,所以 你怎么调用都是没用的,解决办法就是把我们的findViewById方法换 一个生命周期上面调用就OK了,比如我就是在 protected void onAttachedToWindow()