自定义View初体验(一)

工作了一段时间了,由于工作需要,也需要用到一些自定义View的知识,于是通过在网上搜索相关资料,和学习大神的博客。本着深入浅出的原则,现在总结一下自定义View,若本文有什么地方存在问题,请各位赐教。首先是自定义View的步骤
1、自定义View属性
2、重写View构造方法获得自定义属性
3、重写OnMesure
4、重写OnDraw
一、自定义属性
首先我们需要在首先在res/values/  下建立一个attrs.xml , 在里面定义我们的属性和声明我们的整个样式。定义属性格式为: <attr format="属性类型" name="属性名称" />

1.reference:参考某一资源ID。

2. color:颜色值。

3.boolean:布尔值。

4.dimension:尺寸值。

5. float:浮点值。

6. integer:整型值。

7. string:字符串。

8. fraction:百分数。

9. enum:枚举值。

我们定义了属性,那无疑是要使用它们,所以我们还需要声明使用定义的哪些属性:

<pre name="code" class="html"> <declare-styleable name="引用名称"> 
<attr name="属性名称"/>
</declare-styleable> 

 
 

当然我们也可以在里面直接定义属性来使用。

通过这几部简单的设置我们就可以在布局中使用我们的属性了需要注意的是我们需要引入 xmlns:引用名="http://schemas.android.com/apk/res/所在包名",然后便可以在自定义View中使用属性了

二、在自定义view构造方法中获得自定义属性

首先要记得,我们需要写在三个构造参数的构造方法里面,因为我们要使用第三个参数,而系统默认调用的是2个参数的方法,所以我们需要要让

其他两个构造方法调用第三个构造方法。

  TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.属性名, defStyle, 0);  
        int n = a.getIndexCount();  //获得属性数量
        for (int i = 0; i < n; i++)  
        {  
            int attr = a.getIndex(i);  //获得属性值
            switch (attr)  
            {  
            case R.styleable.自定义属性1:  
                a.get类型(attr,默认值)
                break;  
            case R.styleable.<span style="font-family: Arial;">自定义属性2</span><span style="font-family: Arial;">:  </span>
<pre name="code" class="javascript" style="color: rgb(51, 51, 51); font-size: 14px; line-height: 26px;">  <span style="white-space:pre">		</span>a.get类型(attr,默认值)
break; case R.styleable. 自定义属性3 : a.get类型(attr,默认值)
break; } } a.recycle(); //使用自定义属性这个方法一定要调用

 
 三、重写OnMesure方法。 
 

OnMesure可以用来定义自己和子控件的大小。

首先在Android的系统中,如果我没有设置宽高的准确值,设置wrap_content或者MATCH_PARENT系统 能帮我们测量的高度和宽度都是MATCH_PARENT,所以当我们设置了wrap_content 时,需要我们自己进行测量。

1、通过MeasureSpec.getMode得到设置的值:

EXACTLY:一般是设置了明确的值或者是MATCH_PARENT

AT_MOST:表示子布局限制在一个最大值内,一般为WARP_CONTENT

UNSPECIFIED:表示子布局想要多大就多大,很少使用

最后我们通过setMeasuredDimension(width, height); 设置View的宽高

通过这些介绍你是否对自定义View有初步的了解了呢?如有什么问题,欢迎在留言区讨论






你可能感兴趣的:(android,基础,自定义view)