安卓自定义的view

安卓的自定义view ,主要分为两种方式:

1.组合控件,类似于 即时通讯中的聊天的titlebar 可以写成一个 自定义的view ,其实就是一些控件的组合

2.自定义的view,继承于view 或者是viewgroup 等,比如说 ,处理滑动冲突的listview ,ScrollView等,还有就是一些类似于圆 角,   圆环等效果,我们默认的控件实现不了的效果,需要通过自定义的view 去实现。

自定义view的重要的函数:

自定义view 中一般会有四个构造函数:

public void SloopView(Context context) {}
public void SloopView(Context context, AttributeSet attrs) {}
public void SloopView(Context context, AttributeSet attrs, int defStyleAttr) {}
public void SloopView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {}

 下面来做一个实验,我们写一个自定义的view 通过log 来确定,到底调用的是哪个函数

结果如下

 

 打印结果如下:

 此时可见,调用的是第二个构造函数,其中,我打印出来第二个构造函数中的,attrs ,其实就是我们在xml中对该自定义view的描述,宽度,高度,还有id 等配置的参数这就是第二个参数的作用

针对于 第三个,第四个构造函数

1 View的属性和主题

     在说后两个构造函数之前,先说说View的属性,在View中有不同的属性,比如layout_width等,TextView还有textColor这些特有的属性,我们可以对这些属性进行不同的配置进而实现不同的效果。而且属性也可以在不同的位置进行配置。以TextView为例,android:textColor这个属性可以在多个地方配置,可以直接写在xml中,可以在xml中以style的形式定义,这两种是我们平时见得较多的,其实还有一种背后的力量可以给属性赋值,那就是主题。

     我们在android中可以配置一个主题,从而使得一些View即使你不对其进行任何配置,它都会有一些已经默认赋值的属性,这就是主题的功劳。

     View类的后两个构造函数都是与主题相关的,也就是说,在你自定义View时,如果不需要你的View随着主题变化而变化,有前两个构造函数就OK了,但是如果你想你的View随着主题变化而变化,就需要利用后两个构造函数了。

2 属性赋值的优先级

         当可以在多个地方赋值属性时,一个问题就不可避免的出现了:优先级!!!

         一个属性可以在多个地方赋值,xml定义,xml中引入style,theme中直接指定,defStyleAttr,defStyleRes 这5个地方

 3.优先级分别为:

【结论 总】属性赋值优先级   Xml定义 > xml的style定义 > defStyleAttr > defStyleRes> theme直接定义

四 总结

在View类中有四个构造函数,涉及到多个参数,

Context:上线文,这个不用多说

AttributeSet attrs: 从xml中定义的参数

int defStyleAttr :主题中优先级最高的属性

int defStyleRes  : 优先级次之的内置于View的style

在android中的属性可以在多个地方进行赋值,涉及到的优先级排序为:

Xml直接定义 > xml中style引用 > defStyleAttr > defStyleRes > theme直接定义

参照文章地址为:

https://blog.csdn.net/zhao123h/article/details/52210732

设置测试的文字的颜色的style ,加上配置文件上的代码 以便理解

布局文件的代码如下:

 但是运行之后,会发现,默认的文字的显示为蓝色,并不是在actionbar中第二次设置的颜色,此处就是因为defStyleAttr的作用

第四个构造函数中第三个参数defStyleAttr,从名字就能看出,是一个属性资源。

这个属性资源跟主题有一个奇妙的协议:只要在主题中对这个属性赋值,该View就会自动应用这个属性的值。

不论下面有没有再次对同样的属性进行二次赋值 ,如上例子所示,已经在默认的style中设置了,文字颜色,第二次进行文字颜色的设置 ,但是并不起任何作用

再看看在第四个构造函数中有一个参数defStyleRes,这个参数说,只有在第三个参数defStyleAttr为0,或者主题中没有找到这个defStyleAttr属性的赋值时,才可以启用。而且这个参数不再是Attr了,而是真正的style。其实这也是一种低级别的“默认主题”,即在主题未声明属性值时,我们可以主动的给一个style,使用这个构造函数定义出的View,其主题就是这个定义defStyleRes(是一种写死的style,因此优先级被调低)。

猜你喜欢

转载自blog.csdn.net/weixin_37166398/article/details/81096618