Android设置系统主题颜色

经常有看到某些应用设置主题颜色比如:
Android设置系统主题颜色_第1张图片

这个是如何实现的呢?思考一下,这个状态栏的颜色取值于系统预设的三个基本色ColorPrimary,我们修改这个可以改状态栏的颜色,但是想要动态的随心所欲就不太现实了。

我想到的方法是,自定义系统状态栏,和titlebar然后自己就可以随心所欲了。
步骤:

  1. 设置全局Theme为NotitleBar类型的Theme
  2. 获取状态栏高度(顺便获取下底部菜单栏高度,部分机型有,比如华为部分机型)
  3. 自定义全局Application,设置color 的SharedPreference
  4. 设置BaseActivity设置目标颜色即可
  5. Activity继承BaseActivtiy然后就有预设的颜色了,然后设置主题色的功能就是修改SharedPreference即可

部分实现代码:
1.Theme设置
这个两个两个属性是我设置的解决系统启动白屏的背景图和关闭Activity的动画,可有可无。根据需要自己设置一下就是。

AndroidManiFest.xml引用

 ".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来初始化颜色的

效果:
Android设置系统主题颜色_第2张图片

个人原因,整个代码我就不传了,如果有不懂的欢迎讨论,如果有更好的也欢迎。这个实现主要就是设置content的padding为状态栏的高度+底部菜单栏的高度,其实状态栏的颜色和底部菜单栏的颜色是实现是整个布局都是这个颜色,但是content把中间的遮挡了所以视觉上就只改变了上下的颜色,底部菜单栏,如果有不获取设置,view是会在菜单栏之下的,所以如果想改一下底部菜单栏的背景色,上边我也贴了底部菜单栏id获取方式,类似的修改下背景色也是可以的

当然你想设置drawable图片背景也是可以的哦,提示下获取颜色的Int不要用R.color.xxx,这种找到的是颜色的代表id,就像是身份证不是本人,用这个就行 val color = ContextCompat.getColor(this,R.color.colorPrimary)

你可能感兴趣的:(Android问题小笔记)