初识Style和Theme

初识Style和Theme

学习自

  • http://www.jcodecraeer.com/a/basictutorial/2016/0812/6533.html

认识Style

大家还记得如何设置一个 无限循环的或者 具有具体进度的ProgressBar吗?

<ProgressBar
    style="@style/Base.Widget.AppCompat.ProgressBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp" />

显示效果

<ProgressBar
    style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:progress="50" />

显示效果

那为什么同样都是一个 ProgressBar 控件,但是为什么会有如此大相庭径的显示效果呢?请注意这两种的显示效果的 Style 是不相同的。

我们看一下这两个Style的源码:

<style name="Base.Widget.AppCompat.ProgressBar" parent="android:Widget.ProgressBar">
    <item name="android:minWidth">@dimen/abc_action_bar_progress_bar_size</item>
    <item name="android:maxWidth">@dimen/abc_action_bar_progress_bar_size</item>
    <item name="android:minHeight">@dimen/abc_action_bar_progress_bar_size</item>
    <item name="android:maxHeight">@dimen/abc_action_bar_progress_bar_size</item>
</style>
<!-- Base.Widget.AppCompat.ProgressBar 继承自 android:Widget.ProgressBar-->
<!-- android:Widget.ProgressBar 的源码-->

<style name="Widget.ProgressBar">
    <item name="indeterminateOnly">true</item>
    <item name="indeterminateDrawable">@drawable/progress_medium_white</item>
    <item name="indeterminateBehavior">repeat</item>
    <item name="indeterminateDuration">3500</item>
    <item name="minWidth">48dip</item>
    <item name="maxWidth">48dip</item>
    <item name="minHeight">48dip</item>
    <item name="maxHeight">48dip</item>
    <item name="mirrorForRtl">false</item>
</style>

从上面的Style中我们可以发现,这不就是View的属性吗。看到这里,我们应该就对Style有一个了解了——Style 就是对View的属性的抽取,避免了繁琐的设置属性的机械性工作,并且也更易于修改,避免了冗余的代码。

自定义Style

在一个Android项目中,使用统一的样式的Button是非常重要的,所以Button的一些通用的属性我们可以抽取成为 Style。直接自 res/values/styles.xml 文件中添加。

<!--
  声明一个Button的Style
  一个粉色的背景
  白色的字体
-->
<style name="MyButton">
    <item name="android:background">#c25454</item>
    <item name="android:textAllCaps">false</item>
    <item name="android:textColor">#FFFFFF</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
</style>

在布局文件中使用它。

<!-- 通过使用style,避免了繁琐的属性的声明 -->
<Button
    style="@style/MyButton"
    android:text="Button" />

Style的继承

Style同样是可以进行继承的。

<style name="MyButton">
    <item name="android:background">#c25454</item>
    <item name="android:textAllCaps">false</item>
    <item name="android:textColor">#FFFFFF</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
</style>
<!--其他属性继承自MyButton,但是自己又重新定义了background的值-->
<style name="MyButton.Blue" parent="MyButton">
    <item name="android:background">#90206dcc</item>
</style>

Theme

Style是为View设置的,那么有没有这么一种“Style”是为一个Activity乃至为整个系统设置一个 Style 呢? 当然是有这么一个东西了,他就是 Theme

Theme可以应用于 Activity和Application(整个应用),但是为了保证真个APP的界面的风格是统一的,正常情况下并不会为Activity来单独地设置一个Theme,往往都是为整个Application来设置Theme。

为Application和Activity设置Theme

<!-- Theme属性设置整个Application的Theme -->
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <!-- Theme属性设置属于该Activity的Theme -->
    <activity
        android:name=".MainActivity"
        android:theme="@style/Theme.AppCompat.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

</application>

@style/AppTheme

Application被设置的一个默认的Theme APPTheme 位于 src/values/styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

可以看出来 Theme 也是一个Style,我们可以同改变AppTheme的相关属性来影响Application的显示效果。

Theme Editor

当然,通过写 xml 的代码来自定义个Theme真是太痛苦了。幸好AndroidStudio为我们提供了Theme的GUI的设计器。

总结

根据上面的选项我们就可以比较轻松的修改我们的Theme了,当然如果想要让Theme更好看一些,还是得需要参考一些设计的比较好的作品,或者说采用一些经典的配色,本文就到此结束了,在下一篇的文章呢,将会带学习一下Android换肤的功能。

原文地址:https://www.cnblogs.com/slyfox/p/9739778.html

时间: 2024-10-16 03:21:58

初识Style和Theme的相关文章

Android的Style和Theme 译文

Style 是Window和View的一种外观和格式的属性集合.它可以作为高度,间距,字体大小,背景颜色等属性.Style是一种 xml 资源文件,放在和布局文件不同的文件夹里: Style 的设计理念和 Web一脉相承--即它们都允许你把内容和样式分离. 例如,你用Style可以把下面这个xml文件: <TextView android:layout_width="fill_parent" android:layout_height="wrap_content&quo

Android笔记(七十二) Style和Theme

我们尝尝需要使用setText.setColor.setTextSize等属性来设置控件的样式,但是每个控件都需要设置这些属性,工作量无疑是巨大的,并且后期维护起来也不方便. Style Android中的样式(style)包含一组格式,为一个组件设置使用某个样式时,该样式所包含的全部格式都将会应用在这个组件上. Android的样式资源文件放在/res/values目录下,其跟元素是<resources>,该元素内包含多个<style>子元素,每个子元素都是一个样式. <s

QML官方系列教程——Use Case - Style And Theme Support

附网址:http://qt-project.org/doc/qt-5/qtquick-usecase-styling.html Use Case - Style And Theme Support-- 用例 - 风格和主题支持 Qt Quick模块提供的类型并不能独立地覆盖用户界面所需要的所有组件.一个常见的做法是通过Qt Quick的基本模块开发一套自定义样式的用户界面组件.通过可复用组件我们很容易做到这一点. 通过使用可复用组件的方式,你可以定义该组件在程序中需要呈现的外观,并直接为它设计一

Android零碎知识之Style and Theme

Android的styles资源文件中存在了我们在应用中定义的各种style,它们都是以style开始的元素,包含许多属性的集合.但我们一般般它们分为style和theme,那它们有什么区别呢? 一.Style or Theme what   theme是一种特殊的style,我们通常认为style是运用在一个view或者window上,而theme是运用在activity或者application上的.style在布局文件中通过[email protected]/[style name]引入,

android 主题和样式-style和Theme的区别和使用

项目中经常使用style和Theme,但却从来没有考虑过它们的区别,只会copy来copy去的,有时候还有些迷茫,为了彻底告别迷茫,现把这两者的区别和使用总结出来,供自己和大伙参考 一.作用域 Theme是针对窗体级别的,改变窗体样式. Style是针对窗体元素级别的,改变指定控件或者Layout的样式 二.使用方式 Theme 1. 在res\values\ 下创建themes.xml或者styles.xml文件 2. 添加<resouces>节点(根节点) 3. 添加自定义的style 4

Pro Android学习笔记(二四):用户界面和控制(12):Style和Theme

静态格式 在res/values中设置静态的Style,在资源中设置静态Style可使用的HTML格式有<i> <u> <b> <sup> <sub> <strike> <big> <small> <monospace>. <string name="ui_styleText_1"><i>Static</i> style <u>in

android的style控制Theme

value-v14就是在API14(4.0)的手机上所使用的Theme(其他版本以此类推) theme的名字叫做AppTheme,后面写有继承自哪个Theme,如下所示 <style name="AppBaseTheme" parent="@android:style/Theme.Light.NoTitleBar"> <item name="android:windowContentOverlay">@null</i

【转】Pro Android学习笔记(二四):用户界面和控制(12):Style和Theme

目录(?)[-] 静态格式 代码中设定 Style Theme 静态格式 在res/values中设置静态的Style,在资源中设置静态Style可使用的HTML格式有<i> <u> <b> <sup> <sub> <strike> <big> <small> <monospace>. <string name="ui_styleText_1"><i>St

Android Style 和 Theme学习

一.Style用来定义Android View或者Windows样式,在res/values/styles.xml文件中进行定义,名字唯一: </pre><pre name="code" class="html"><pre class="prettyprint" style="font-size: 13px; margin-top: 0px; margin-bottom: 1em; color: rgb(0