1. 程式人生 > >Android樣式的開發:Style篇

Android樣式的開發:Style篇

樣式的定義

Android的樣式一般定義在res/values/styles.xml檔案中,其中有一個根元素<resource>,而具體的每種樣式定義則是通過<resource>下的子標籤<style>來完成,<style>通過新增多個<item>來設定樣式不同的屬性。
另外,樣式是可以繼承的,可通過<style>標籤的parent屬性宣告要繼承的樣式,也可通過點字首 (.) 繼承,點前面為父樣式名稱,後面為子樣式名稱。點字首方式只適用於自定義的樣式,若要繼承Android內建的樣式,則只能通過parent屬性宣告。
用個例項說明具體的用法吧,以下程式碼為Android 5.0系統預設的按鈕樣式:

<style name="Widget.Material.Button">
    <item name="background">@drawable/btn_default_material</item>
    <item name="textAppearance">?attr/textAppearanceButton</item>
    <item name="minHeight">48dip</item>
    <item name="minWidth">88dip</item>
    <item
name="stateListAnimator">@anim/button_state_list_anim_material</item> <item name="focusable">true</item> <item name="clickable">true</item> <item name="gravity">center_vertical|center_horizontal</item> </style>

其中,stateListAnimator指定狀態改變時的動畫,button_state_list_anim_material

的程式碼如下:

<!-- res/anim/button_state_list_anim_material.xml -->
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:state_enabled="true">
        <set>
            <objectAnimator 
                android:propertyName="translationZ"
                android:duration="@integer/button_pressed_animation_duration"
                android:valueTo="@dimen/button_pressed_z_material"
                android:valueType="floatType" />
            <objectAnimator 
                android:propertyName="elevation"
                android:duration="0"
                android:valueTo="@dimen/button_elevation_material"
                android:valueType="floatType" />
        </set>
    </item>
    <!-- base state -->
    <item android:state_enabled="true">
        <set>
            <objectAnimator 
                android:propertyName="translationZ"
                android:duration="@integer/button_pressed_animation_duration"
                android:valueTo="0"
                android:startDelay="@integer/button_pressed_animation_delay"
                android:valueType="floatType"/>
            <objectAnimator 
                android:propertyName="elevation"
                android:duration="0"
                android:valueTo="@dimen/button_elevation_material"
                android:valueType="floatType" />
        </set>
    </item>
    <item>
        <set>
            <objectAnimator 
                android:propertyName="translationZ"
                android:duration="0"
                android:valueTo="0"
                android:valueType="floatType"/>
            <objectAnimator 
                android:propertyName="elevation"
                android:duration="0"
                android:valueTo="0"
                android:valueType="floatType"/>
        </set>
    </item>
</selector>

可以看到,每種狀態的動畫為屬性動畫集,屬性動畫的用法請參考Property Animation篇
現在我想繼承Widget.Material.Button樣式,改變背景和文字顏色,那麼,程式碼如下:

<!-- res/values/styles.xml -->
<resources>
    <style name="ButtonNormal" parent="@android:style/Widget.Material.Button" >
        <item name="android:background">@drawable/bg_btn_selector</item>
        <item name="android:textColor">@color/text_btn_selector</item>
    </style>
</resources>

其中,@drawable/bg_btn_selector@color/text_btn_selector的實現請參照selector篇
有些按鈕,我只想改變文字顏色,但背景想讓它透明,這時就可以用點字首的方式繼承以上的樣式,程式碼如下:

<!-- res/values/styles.xml -->
<resources>
    <style name="ButtonNormal" parent="@android:style/Widget.Material.Button">
        <item name="android:background">@drawable/bg_btn_selector</item>
        <item name="android:textColor">@color/text_btn_selector</item>
    </style>

    <style name="ButtonNormal.Transparent">
        <item name="android:background">@drawable/bg_btn_transparent</item>
        <item name="android:textColor">@color/text_btn_selector</item>
    </style>
</resources>

引用的時候只要在相應的Button裡新增style就可以了,程式碼如下:

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="onAction"
    android:text="@string/btn_action"
    style="@style/ButtonNormal.Transparent" />

有時候,定義的樣式太多,如果都放在styles.xml檔案裡,那這檔案也太臃腫了。因此,可以將樣式分類拆分成多個檔案。Android系統本身也拆分為多個檔案存放的,如下列表全都是樣式檔案:

styles.xml
styles_device_defaults.xml
styles_holo.xml
styles_leanback.xml
styles_material.xml
styles_micro.xml
themes.xml
themes_device_defaults.xml
themes_holo.xml
themes_leanback.xml
themes_material.xml
themes_micro.xml

其中,主要分為兩大類,styles定義了簡單的樣式,而themes則定義了主題。

主題的定義

以上的簡單例子只用於單個View,這是樣式最簡單的用法。但樣式的用法不只是用於單個View,也能用於Activity或整個Application,這時候需要在相應的<activity>標籤或<application>標籤裡設定android:theme*屬性,引用的其實也是style*,但一般稱為主題。

  • themes.xml:低版本的主題,目標API level一般為10或以下
  • themes_holo.xml:從API level 11新增的主題
  • themes_device_defaults.xml:從API level 14新增的主題
  • themes_material.xml:從API level 21新增的主題
  • themes_micro.xml:應該是用於Android Wear的主題
  • themes_leanback.xml: 還不清楚什麼用

不過在實際應用中,因為大部分都採用相容包的,一般都會採用相容包提供的一套主題:Theme.AppCompatAppCompat主題預設會根據不同版本的系統自動匹配相應的主題,比如在Android 5.0系統,它會繼承Material主題。不過這也會導致一個問題,不同版本的系統使用不同主題,就會出現不同的體驗。因此,為了統一使用者體驗,最好還是自定義主題。

自定義主題也很簡單,只要繼承某一父主題,然後在<activity>標籤或<application>中引用就可以了。
主題的定義示例如下:

<resources> 
    <style name="AppTheme" parent="Theme.AppCompat">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="windowAnimationStyle">@style/WindowAnimation</item>
    </style>

    <!-- Standard animations for a full-screen window or activity. -->
    <style name="WindowAnimation" parent="@android:style/Animation.Activity">
        <item name="activityOpenEnterAnimation">@anim/activity_open_enter</item>
        <item name="activityOpenExitAnimation">@anim/activity_open_exit</item>
        <item name="activityCloseEnterAnimation">@anim/activity_close_enter</item>
        <item name="activityCloseExitAnimation">@anim/activity_close_exit</item>
    </style>
</resources>

其中,WindowAnimation重新指定了Activity的轉場動畫,以下為activity_close_exit的示例程式碼:

<!-- res/anim/activity_close_exit.xml -->
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false"
    android:zAdjustment="top">
    <alpha 
        android:fromAlpha="0.0" 
        android:toAlpha="1.0"
        android:interpolator="@interpolator/decelerate_quart"
        android:fillEnabled="true"
        android:fillBefore="false" 
        android:fillAfter="true"
        android:duration="200" />
    <translate 
        android:fromYDelta="8%" 
        android:toYDelta="0"
        android:fillEnabled="true" 
        android:fillBefore="true" 
        android:fillAfter="true"
        android:interpolator="@interpolator/decelerate_quint"
        android:duration="350" />
</set>

接著,若要使用到整個Application,則在AndroidManifest.xml<application>標籤設定android:theme屬性,示例程式碼如下:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">
    <!-- activity here -->
</application>

相關推薦

Android樣式開發:Style

樣式的定義 Android的樣式一般定義在res/values/styles.xml檔案中,其中有一個根元素<resource>,而具體的每種樣式定義則是通過<resource>下的子標籤<style>來完成,<style>

Android 樣式開發:Drawable分類資源彙總詳解(一)

Drawable Resources 解釋為:可繪製物件資源。是指可在螢幕上繪製的圖形,以及可以使用 getDrawable(int) 等 API 檢索或者應用到具有 android:drawable

Android JNI開發高階

  有關Android JNI開發中比較強大和有用的功能就是從JNI層建立、構造Java的類或執行Java層的方法獲取屬性等操作。   一、類的相關操作   1. jclass FindClass(JNIEnv *env, const char *name); 查詢類   該函式可能做過Java開發的不會陌

Android樣式開發--drawable總結

Android有很多種drawable型別,除了前幾篇詳細講解的shape、selector、layer-list,theme和style。 還有上一篇提到的color、bitmap、clip、scale、inset、transition、rotate、animated

Android樣式開發——常用標籤

1.clip標籤 使用clip標籤可以對drawable進行裁剪,在做進度條時很有用。通過設定level值控制裁剪多少,level取值範圍為0~10000,預設為0,表示完全裁剪,圖片將不可見;10000則完全不裁剪,可見完整圖片。看看clip標 c

Android JNI開發提高

有關JNI的開發技術,我們繼續圍繞Android平臺進行,JNI可以支援C或C++,從目前為止我們寫過的JNI程式碼均為C實現的,即檔名為.C而C++的和這些有什麼不同呢? Android平臺上的JNI一般使用C還是C++編寫呢?    Android平臺在中間層和大部分的

Android-NDK開發之基礎--Android JNI開發高階(JNI中的常用方法)

有關Android JNI開發中比較強大和有用的功能就是從JNI層建立、構造Java的類或執行Java層的方法獲取屬性等操作。    一、類的相關操作    1. jclass FindClass(JNIEnv *env, const char *name);  查詢類   

Android樣式開發:selector

col line highlight 有用 詳細 sde n) -- abi 上一篇詳細講了shape的用法,講解了怎麽用shape自定義矩形、圓形、線形和環形,以及有哪些需要註意的地方。不過,shape只能定義單一的形狀,而實際應用中,很多地方比如按鈕、Tab、ListI

Android 應用開發】 ActionBar 樣式具體解釋 -- 樣式 主題 簡單介紹 Actionbar 的 icon logo 標題 菜單樣式改動

detail sub str 進度條 代碼分析 extc dst 模式 html 作者 : 萬境絕塵 ([email protected]/* */)轉載請著名出處 : http://blog.csdn.net/shulianghan/article/deta

Android UI開發第三十一——Android的Holo Theme

        好長時間沒寫Android UI方面的文章了,今天就閒扯一下Android的Holo主題。一直做android開發的可能都知道,Android 系統的UI有過兩次大的變化,一次是andr

Android外掛開發初探——基礎

Android外掛開發初探 對於Android的外掛化其實已經討論已久了,但是市面上還沒有非常靠譜成熟的外掛框架供我們使用。這裡我們就嘗試性的對比一下Java中,我們使用外掛化該是一個怎麼樣的流程,且我們如何將此流程移植到Android框架上去使用。很多程式碼

Android UI開發第十四——可以移動的懸浮框

          工作中遇到一些專案需要把窗體顯示在最上層,像來電彈窗顯示電話號碼等資訊或攔截簡訊資訊顯示給使用者,我們想這些資料放在最上層,activity就滿足不了我們的需求了,有些開發者使用了迴圈顯示Toast的方式,toast是不能獲得焦點的,這種方法是不可取的。這

Android樣式化的定性物件--Style樣式的定義

主程式: package cn.com.hyron.activity; import android.app.Activity; import android.os.Bundle; public class StyleActivity extends Activity {

安卓開發入門(一):Android Studio匯入ApiDemos

引言 本人程式設計師,之前做網站比較多,nodejs/express+html/css+mysql,再之前也做過Java開發,程式設計上還是有豐富的經驗。 在持續的實戰中,發現想做產品的話,前端似乎更重要,因為前端才能看到產品形態。雖然說移動端形勢已經每況愈

Android UI開發第二十五——分享一自定義的 Action Bar

       Action Bar是android3.0以後才引入的,主要是替代3.0以前的menu和tittle bar。在3.0之前是不能使用Action Bar功能的。這裡引入了自定義的Actio

Android系統(一)——建立Android系統開發環境

《深入解析Android5.0系統》 一書筆記 在開始研究Android系統之前,我們要準備好一些開發的資料,比如Ubuntu,原始碼,開發資料等,Android系統本身來說,非常的龐大,應用使用的是JAVA語言,底層使用C/C++,所以,如果條件允許

Android學習之主題樣式開發詳解

本文和大家分享的主要是android開發主題樣式相關內容,一起來看看吧,希望對大家學習和使用這部分內容有所幫助。   app如何設定主題   1. 在res/values/styles.xml檔案中新增程式碼:   2. 在

Android UI開發第四十——ScrollTricks介紹

ScrollTricks是一個開源控制元件,實現了兩個簡單功能:1、Quick Return:向上滑動時,View也向上滑動並且消失,當向下滑動時,View馬上出現。例如Google Now的搜尋功能。

Android應用開發之提升使用者體驗1–style和themes

Android的Style設計就是提升使用者體驗的關鍵之一。Android上的Style分為了兩個方面: 1.Theme是針對窗體級別的,改變窗體樣式; 2.Style是針對窗體元素級別的,改變指定控制元件或者Layout的樣式。 Android系統的th

C# Xamarin For Android移動開發基礎進修

一、課程介紹 英文原文:C# is the best language for mobile app development. Anything you can do in Objective-C, Swift or Java, you can do in C#。 中文