1. 程式人生 > >Android設定系統主題顏色

Android設定系統主題顏色

經常有看到某些應用設定主題顏色比如:
這裡寫圖片描述

這個是如何實現的呢?思考一下,這個狀態列的顏色取值於系統預設的三個基本色ColorPrimary,我們修改這個可以改狀態列的顏色,但是想要動態的隨心所欲就不太現實了。

我想到的方法是,自定義系統狀態列,和titlebar然後自己就可以隨心所欲了。
步驟:

  1. 設定全域性Theme為NotitleBar型別的Theme
  2. 獲取狀態列高度(順便獲取下底部選單欄高度,部分機型有,比如華為部分機型)
  3. 自定義全域性Application,設定color 的SharedPreference
  4. 設定BaseActivity設定目標顏色即可
  5. Activity繼承BaseActivtiy然後就有預設的顏色了,然後設定主題色的功能就是修改SharedPreference即可

部分實現程式碼:
1.Theme設定
這個兩個兩個屬性是我設定的解決系統啟動白屏的背景圖和關閉Activity的動畫,可有可無。根據需要自己設定一下就是。

<style name="MyTranslucentTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowBackground">@mipmap/img_splash_bg</item>
        <item name="android:windowAnimationStyle"
>@anim/slide_out_right</item> </style>

AndroidManiFest.xml引用

 <application
        android:name=".app.MyApplication"
        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/MyTranslucentTheme">

2.獲取狀態列高度和底部選單欄高度

    /**
     * 獲取狀態列高度
     */
    fun getStatusBarHeight(context: Context) :Int{
        var result = 0
        val resId = context.resources.getIdentifier("status_bar_height", "dimen", "android")
        if (resId > 0) {
            result = context.resources.getDimensionPixelSize(resId)
        }
        return result

    }

    /**
     * 底部選單欄高度
     */
    fun getBottomBarHeight(context: Context):Int{
        var result = 0
        val hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey()
        val hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK)
        if (hasBackKey && hasMenuKey) return result
        val resId = context.resources.getIdentifier("navigation_bar_height", "dimen", "android")
        if (resId > 0) {
            result = context.resources.getDimensionPixelSize(resId)
        }
        return result
    }

3.自定義全域性Application:(kotlin編寫的,如需要自行轉java,companion object = static)

class MyApplication : Application() {
 companion object {
        lateinit var baseColor : SharedPreferences
        }
    override fun onCreate() {
        super.onCreate()
        baseColor = getSharedPreferences("SETTING_COLOR", Context.MODE_PRIVATE)
    }
    }

4.BaseActivity.java部分程式碼

abstract class BaseActivity : AppCompatActivity(){
    /**
     * 獲取狀態列高度
     */
    private val statusBarHeight: Int
        get() = ScreenUtils.getStatusBarHeight(this)


    private val bottomBarHeight: Int
        get() = ScreenUtils.getBottomBarHeight(this)

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        super.setContentView(R.layout.activity_base_title_layout)

//預留狀態列高度
        base_layout.setPadding(0,statusBarHeight,0,bottom)
        //base_layout設定背景顏色
        base_layout.setBackgroundColor(MyApplication.baseColor.getInt("SETTING_COLOR", Color.RED))
        //自定義titleBar設定顏色
        main_title_bar_view.setBackgroundColor(MyApplication.baseColor.getInt("SETTING_COLOR", Color.RED))
}

5.Activity使用:
(這個實驗大家可以用button來測試,我這邊測試沒問題,具體就不多寫了)

class Main2Activity:BaseActivity(){
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        super.setContentView(R.layout.activity_main2)

        //獲取全域性顏色
        val color = ContextCompat.getColor(this,R.color.colorPrimary)
        //更改全域性顏色
        MyApplication.baseColor.edit().putInt("SETTING_COLOR",color).commit()
        }
}

需要功能的就是設定一下全域性主題色設定的ui然後設定監聽改變sharedPreference即可,每次讀取都會通過baseActivity來初始化顏色的

效果:
這裡寫圖片描述

個人原因,整個程式碼我就不傳了,如果有不懂的歡迎討論,如果有更好的也歡迎。這個實現主要就是設定content的padding為狀態列的高度+底部選單欄的高度,其實狀態列的顏色和底部選單欄的顏色是實現是整個佈局都是這個顏色,但是content把中間的遮擋了所以視覺上就只改變了上下的顏色,底部選單欄,如果有不獲取設定,view是會在選單欄之下的,所以如果想改一下底部選單欄的背景色,上邊我也貼了底部選單欄id獲取方式,類似的修改下背景色也是可以的

當然你想設定drawable圖片背景也是可以的哦,提示下獲取顏色的Int不要用R.color.xxx,這種找到的是顏色的代表id,就像是身份證不是本人,用這個就行 val color = ContextCompat.getColor(this,R.color.colorPrimary)

相關推薦

Android設定系統主題顏色

經常有看到某些應用設定主題顏色比如: 這個是如何實現的呢?思考一下,這個狀態列的顏色取值於系統預設的三個基本色ColorPrimary,我們修改這個可以改狀態列的顏色,但是想要動態的隨心所欲就不太現實了。 我想到的方法是,自定義系統狀態列,和titleb

Qt android 設定系統狀態列為全透明,半透明、全屏,設定狀態列顏色,修改程式圖示

實現Qt平臺下,安卓系統狀態列的相關設定(全透明,半透明、全屏,設定狀態列顏色,修改程式圖示,網上文章大多數提供多種方法,但是講述的雲裡霧裡,沒有說清楚,以下是本人自己整理,希望大家相互交流學習) 實驗環境: Qt 5.12 程式語言:qml 和 c++ 執行平臺:android 正

【Windows 10 應用開發】跟隨系統主題顏色

tex 線程 align tro 都是 顏色 stroke object 截圖 有些時候,希望應用程序中的某些顏色可以與系統的主題顏色相同,並且當系統主題色改變時進行同步。 實現過程並不復雜,主要用到 UISettings 類,它公開一個 GetColorValue 方法

設定DatePickerDialog主題顏色及起始日期

一、設定DatePickerDialog主題顏色 如圖: 程式碼: findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() { @Override

android設定狀態列顏色為深色

public boolean setDeepStatusBar(boolean isChange,Activity mActivity) { if (!isChange){ return false; } if(Build.VERSI

通知欄設定系統字型顏色

Android的Rom版本非常多, 通知欄顏色也各有不同, 如HTC是白底, 紅米Note是暗色透明, 也有其他黑底, 灰底等. 統一設定相同的字型顏色, 必然會導致顏色衝突. 那麼如何設定字型顏色, 可以正常顯示呢? 如HTC(5.0), 標題

android 設定系統dialog 樣式

 1、編寫一個文字樣式。   DIALOG的標題是一個textview,在sytles.xml中,新增如下程式碼來設定你自己的文字樣式:   ?   <style name="DialogWindowTitle">   <item name="androi

android設定系統文字大小後App的文字會變化

對於程式設計師來說,我們很少會去設定手機的字型大小,因此也不會出現設定字型後App介面變化。 但是近期由於我們開發的專案中巢狀的H5頁面太多,很多手機適配都沒有問題,唯獨有一款紅米Note2在載入H5頁面後變的面目全非,後來又採購了一臺紅米note2適配是沒有問題的。經過排

Android 設定系統亮度

Android 播放器中修改系統亮度 /** * 播放器Activity */ public class PlayerActivity extends Activity { /** * 系統是否自動調節亮度 */ private boo

android 設定系統自帶字型

1,佈局檔案中設定//設定字型android:typeface="normal" //sans  serif  monospace設定和樣式android:textStyle="normal"  //bold  粗體  italic斜體android:fontFamily="

android-設定系統及應用級螢幕亮度

/** * 獲得當前螢幕亮度的模式 * SCREEN_BRIGHTNESS_MODE_AUTOMATIC=1 為自動調節螢幕亮度 * SCREEN_BRIGHTNESS_MODE_MANUAL=0 為手動調節螢幕亮度 */ private i

android設定狀態列顏色(沉浸式狀態列)

設定狀態列顏色的方法是andorid4.4以後支援的,最少要api19以上才可以使用喲。 方法如下: 第一種↓ public static void setStatusBarTranslucent(ViewGroup vg, Activ

Android開發淺談:關於如何把手機殼顏色設定為我們App的主題顏色

昨天一則新聞刷爆了微博,並迅速的攻佔了我們的朋友圈。 中國平安財險科技中心,一個程式設計師把產品經理給打了,原因是產品經理提出一個需求:根據使用者手機殼的顏色可以改變App的主題顏色.....然後他就被程式設計師給打了。 很多程式設計師看到這樣的新聞,包括我,都會拍案叫好

Android 設定應用程式的主題顏色

1.首先了解一下Material Design 各個屬性在應用程式的定義 2.在color.xml檔案中定義以上顏色值 <resources> <color name="

iOS設定主題顏色方便使用

在AppDelegate.h檔案中宣告一個全域性變數: @property UIColor *zhuTiColor; 在AppDelegate.m中,新增:@synthesize zhuTiColor; 然後在 (BOOL)application:(UIApp

eclipse設定護眼豆沙綠背景色以及windows系統視窗顏色

顏色程式碼:red:204;green:232;blue:207 如果設定了系統視窗豆沙色,eclipse就不需要再設定了,因為eclipse預設跟隨系統   1 設定變數顏色   2 設定綠豆沙背景色     3

android 狀態列字型顏色設定 黑色 anctivity+dialog

package com.bufanbudao.kaikeba.utils; import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; import andr

IntelliJ IDEA 如何設定黑色主題以及Java字型的大小與顏色

1.設定黑色主題 File -- Settings -- Appearance&Behavior -- Appearance 面板 -- Theme ,選擇Darcula 2.設定程式碼編輯框的字型大小 File -- Settings -- Editor -- Fon

Android 8.1 非系統程序設定系統域屬性問題

1. 程序間通過設定屬性進行互動 Android 系統開發中經常需要通過屬性在各個程序間傳遞資訊,通過一個程序 set_property,另一個程序 get_property 達到程序間通訊的需求。 屬性獲取沒有限制,但是如果需要程序可以進行設定屬性操作,則需要做一些處理。因為在

Android 設定狀態列的的固定顏色和圖片填充

一,狀態列設定固定的顏色 設定style.xml 的樣式 <style name="ColorTranslucentTheme" parent="Theme.AppComp