QMUI中Theme的抽象、继承、多态

前言

最近在给项目封装UI组件,目前在借鉴的项目是腾讯的QMUI编写UI组件,下面是我对Android主题样式设计包含的继承抽象多态的三个特性进行了一些心得讲解。

主题中的抽象、继承和多态

继承和多态

模仿QMUI的主题样式,我在自己的项目中进行了样式的简单配置。
main/res/values/jmui_themes_compat.xml

    <!-- 关于Theme的继承关系:
    由于 Theme 需要在不同 API Level 下有不同的配置,并且继承自不同的系统 Theme,所以多层继承。
    
    继承关系和每个层的分工如下:
	AppRootTheme(Theme 的最顶层,各个 API Level 自行决定继承自系统的哪个 Theme)
	  |-values
	  |-values-v21
	  |-values-...
	  |
	AppBaseTheme(基础 Theme,定义所有公用的 style。)
	  |-values
	  |
	AppConfigTheme(可配置的 Theme,各个 API Level 自行配置各自的 style 差异。)
	  |-values
	  |-values-v21
	  |-values-...
	  |
	QMUI(QMUI提供的theme控制, 供外界使用)
	
	So,
	如果要对某 API Level 配置继承自某个系统的 Theme,在 values-v* 目录下修改 qmui_themes.xml 的 AppRootTheme。
	如果要对某 API Level 配置定制化的 Theme,在 values-v* 目录下修改 qmui_themes.xml 的 AppConfigTheme。
	如果在项目中要对特定项目配置业务相关的 Theme,在 values 目录下修改 themes.xml 的 AppTheme。
     -->
    <style name="AppRootTheme.Compat" parent="Theme.AppCompat.DayNight"/>
    <style name="AppBaseTheme.Compat" parent="AppRootTheme.Compat">
    	...
    </style>
   <style name="AppConfigTheme.Compat" parent="AppBaseTheme.Compat" >
       	...
    </style>
     <style name="JMUI.Compat" parent="AppConfigTheme.Compat">
     	...
     </style>
    <style name="JMUI.Compat.NoActionBar">
        ...
    </style>

注释中已经对每个主题样式都进行了详细的定义,这里就不在赘述了。我们来重点分下语法。
样式的基础写法

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="自定义主题样式的名称" parent="继承的主题,可以是自定义主题样式也可以是系统主题样式">
        <item name="属性名称">赋值的对应资源</item>
    </style>
</resources>

根据parent的中文解释,我们可以看见自定义主题中是可以使用继承手段的,在面向对象中继承的主要目的是为了解决代码的复用问题,代码中的JMUI.Compat.NoActionBar就是继承了父类JMUI.Compat的所有特性。

注意:继承关系的其他语法:[父类样式名称].[自定义名称]

在设计的巧妙至于就是重写机制,子类样式通过对父类样式中相同样式名称的修改,可以达到Java语言中重写的效果。

<style name="AppConfigTheme.Compat" parent="AppBaseTheme.Compat" >
 	...
 	<item name="jmui_def_color_blue">#fffffff</item>
</style>

    <style name="JMUI.Compat" parent="AppConfigTheme.Compat">
        <!--**********************************************
            *                qmui common color               *
            **********************************************-->
        <item name="jmui_def_color_blue">#40ac46</item>
        <item name="jmui_customer_color">#40ac22</item>
    </style>

jmui_def_color_blue这个属性若最终是引用的JMUI.Compat主题,那么就会是蓝色。除此之外在样式JMUI.Compat也有多态的特性,可以自己扩展独有的属性,也正式符合了多态的思想(解决代码的扩展性和复用性)

多态是指子类可以替换父类,在实际的代码运行过程中,调用子类的方法实现。

设计中的抽象

   <attr name="abstrat_colorPrimary" format="color"/>
    <style name="JMUI.Compat" parent="AppConfigTheme.Compat">
        <item name="colorPrimary">?attr/abstrat_colorPrimary</item>
    </style>
    <style name="JMUI.Compat.Green">
        <item name="abstrat_colorPrimary">#40ac46</item>
    </style>
      <style name="JMUI.Compat.Red">
        <item name="abstrat_colorPrimary">#FF6B6B</item>
    </style>

Android样式中,我们可以预先一定一个属性叫abstrat_colorPrimary,然后子类样式可以分别对应不同的命名,对abstrat_colorPrimary进行特定的赋值,这里就是使用了面向对象的抽象方法,使用这个方法有个好处,就是可以达到切换主题的效果。

结束语

Android中的主题样式有很多,但是核心的设计思想就是我上面讲到的继承、抽象和多态,在实际的开发中,除了知道思想还不够,还需要对具体的属性进行记录,才能规范的写出App主题样式,下面附录一些常用的样式的含义方便查阅。

<!--应用的主要色调,actionBar默认使用该颜色,Toolbar导航栏的底色-->
        <item name="colorPrimary">?attr/jmui_def_color_blue</item>
        <!--应用的主要暗色调,statusBarColor 默认使用该颜色-->
        <item name="colorPrimaryDark">?attr/jmui_def_color_blue_darken</item>
        <!--一般控件的选中效果默认采用该颜色,如 CheckBox,RadioButton,SwitchCompat等-->
        <item name="colorAccent">?attr/jmui_def_color_blue</item>
        <!--Button normal 状态下的背景色。注意,这种设置与 Button 的 android:background 属性改变背景色不同的是,前者在 Lollipop
        及更高版本上会让 Button 依旧保持阴影和 Ripple 触摸效果.-->
        <item name="colorButtonNormal">?attr/jmui_def_color_blue</item>
        <!--某些 Views “normal” 状态下的颜色,常见如:unselected CheckBox 和 RadioButton,失去焦点时的 EditText,Toolbar 溢出按钮颜色,等等。-->
        <item name="colorControlNormal">?attr/jmui_def_color_blue</item>
        <!--应用的主要文字颜色,actionBar的标题文字默认使用该颜色-->
        <item name="android:textColorPrimary">?attr/jmui_def_color_blue</item>
        <!--辅助的文字颜色,一般比textColorPrimary的颜色弱一点,用于一些弱化的表示,返回箭头也是用这个颜色-->
        <item name="android:textColorSecondary">?attr/jmui_def_color_blue</item>
        <!--    android:windowBackground是视图所在窗口的背景颜色,而 android:background是视图组件的背景颜色-->
        <item name="android:windowBackground">?attr/jmui_def_color_window_background</item>
        <!--默认 EditView 输入框字体的颜色-->
        <item name="android:editTextColor">?attr/jmui_def_color_black</item>

附录

QMUI的Res文件夹下文件备注
文件名称解释备注
Qmui_themes_compat适配主题的文件最初继承的适配的主题,去适配老机型。
Qmui_attrs_base定义项目中最基础常用的属性基础控件属性:button,Dialog,listview,颜色属性:config_textview_red
qmui_style_widget定义自定义控件的常用样式
Config_colors控件颜色定义基础控件的颜色,后期会用在AppConfigTheme中
qmui_colors主题颜色在Qmui中定义大量的主题颜色

参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值