Android设置系统主题颜色
来源:互联网 发布:程序员必看的十大电影 编辑:程序博客网 时间:2024/05/19 14:39
经常有看到某些应用设置主题颜色比如:
这个是如何实现的呢?思考一下,这个状态栏的颜色取值于系统预设的三个基本色ColorPrimary,我们修改这个可以改状态栏的颜色,但是想要动态的随心所欲就不太现实了。
我想到的方法是,自定义系统状态栏,和titlebar然后自己就可以随心所欲了。
步骤:
- 设置全局Theme为NotitleBar类型的Theme
- 获取状态栏高度(顺便获取下底部菜单栏高度,部分机型有,比如华为部分机型)
- 自定义全局Application,设置color 的SharedPreference
- 设置BaseActivity设置目标颜色即可
- 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设置系统主题颜色
- Android studio 设置主题颜色
- Android Studio主题设置、颜色背景配置
- Android 设置应用程序的主题颜色
- Android Studio主题设置、颜色背景配置
- Android Studio主题设置、颜色背景配置
- Android Studio主题设置、颜色背景配置
- Android Studio主题设置、颜色背景配置
- Android Studio主题设置、颜色背景配置
- Android Studio主题设置、颜色背景配置
- utuntu 主题颜色设置
- emacs24 颜色主题设置
- Android设置系统状态栏颜色
- Android设置系统状态栏颜色
- 如何设置android 5.0主题,状态栏,toolbar颜色设定
- Android Studio主题设置(界面背景,字体颜色等)
- android 主题颜色意义
- 主题图自定义颜色设置
- vb.net的关键字和结构体
- u-boot移植流程
- mysql中游标的使用案例详解
- 【比赛】大二如何准备蓝桥杯的比赛?
- 浅谈js中的浅拷贝和深拷贝
- Android设置系统主题颜色
- lintcode&九章算法——No.3 统计数字 ? 待解决
- x264_param_default分析
- tomcat安装Https证书
- Guava Lists.transform 使用及问题
- 上帝不是掷骰子,上帝只是两种形态
- WindowManager 实现悬浮窗 详解
- android实现软键盘弹出,editText随键盘上移,背景不动
- 某一个标签如button,之前通过jQuery添加过一个click事件,然后我想给这个button再添加一个click事件,但是我又不想让之前那个click事件触发,怎么办?