满意答案

noxlqub

2016.05.01

采纳率:51%    等级:7

已帮助:210人

关于阅读类的app,有个夜间模式真是太重要了。

那么有两种方式可以实现夜间模式

1:修改theme,重启activity

优点:正儿八经的夜间模式,配色看着舒服

缺点:图片刺眼、闪屏

2:使用一个带黑色带透明度的View,盖在现有的activity上,效果类似你带上墨镜,看着太阳不刺眼。

优点:不用重启activity,不闪屏;加上透明度过渡动画,模式之间切换非常舒服,解决了1中,白底图片依旧刺眼的问题。;

缺点:配色没变化,就算带上墨镜,白天依旧是白天。

因此,本方案整合了两种解决方案。在夜间配色的基础上,再加上一层墨镜,让图片也变得柔和起来,效果图如下:

可以看待chrome图标的白色底,在夜间模式下也变得柔和了

好,下面来讲讲具体的实现步骤,本环节使用的开发环境是android Studio

1 首先,在values下要准备好三个文件,没有就自己创建

attrs.xml(声明属性的类型,布局xml中用) reference可以使用系统的资源ID,比如R.color.gray; color可以直接使用#ffffff颜色代码

colors.xml(调色板,集中管理颜色hex)遵循 优秀格式规范 ,即调色板模式,避免使用btn1,btn2,fontTitle,fontText之类的颜色名。

#fafafa

#f3f3f3

#cccccc

#777

#383838

#8e9ea4

#34515c

#1e3e4a

#90000000

styles.xml(日间、夜间主题)

@color/white_dark

@color/gray_dark

@color/gray

@drawable/navigator_list_item_day

@drawable/list_item_day

@color/green_dark

@color/white_dark

@color/green_light

@drawable/navigator_list_item_night

@drawable/list_item_night

2定义activity父类,自动托管日间、夜间模式

BaseApplication就是自己包装的Application,通过它,保存日间、夜间模式

Application和Activity,Service一样是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象,用来存储系统的一些信息。通常我们是不需要指定一个Application的,这时系统会自动帮我们创建,如果需要创建自己 的Application,也很简单创建一个类继承 Application并在manifest的application标签中进行注册(只需要给Application标签增加个name属性把自己的 Application的名字定入即可)。

android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application可以说是单例 (singleton)模式的一个类.且application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局 的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。所以通过Application来进行一些,数据传递,数据共享 等,数据缓存等操作。

public class BaseActionBarActivity extends ActionBarActivity {

private BaseApplication mBaseApp = null;

private WindowManager mWindowManager = null;

private View mNightView = null;

private LayoutParams mNightViewParam;

private boolean mIsAddedView;

@Override

protected void onCreate(Bundle savedInstanceState) {

mBaseApp = (BaseApplication) getApplication();

if (mBaseApp.isNightMode())

setTheme(R.style.AppTheme_night);

else

setTheme(R.style.AppTheme_day);

super.onCreate(savedInstanceState);

mIsAddedView = false;

if (mBaseApp.isNightMode()) {

initNightView();

mNightView.setBackgroundResource(R.color.night_mask);

}

}

@Override

protected void onDestroy() {

if (mIsAddedView) {

mBaseApp = null;

mWindowManager.removeViewImmediate(mNightView);

mWindowManager = null;

mNightView = null;

}

super.onDestroy();

}

public void ChangeToDay() {

mBaseApp.setIsNightMode(false);

mNightView.setBackgroundResource(android.R.color.transparent);

}

public void ChangeToNight() {

mBaseApp.setIsNightMode(true);

initNightView();

mNightView.setBackgroundResource(R.color.night_mask);

}

/**

* wait a time until the onresume finish

*/

public void recreateOnResume() {

new Handler().postDelayed(new Runnable() {

public void run() {

recreate();

}

}, 100);

}

private void initNightView() {

if (mIsAddedView == true)

return;

mNightViewParam = new LayoutParams(

LayoutParams.TYPE_APPLICATION,

LayoutParams.FLAG_NOT_TOUCHABLE | LayoutParams.FLAG_NOT_FOCUSABLE,

PixelFormat.TRANSPARENT);

mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);

mNightView = new View(this);

mWindowManager.addView(mNightView, mNightViewParam);

mIsAddedView = true;

}

}

值得一提的是recreateOnResume()函数,因为是从Resume里面重建activity的(避免闪屏)此时, 直接调用系统的recreate函数时,会报错,原因是resume还没执行完,就被recreate了,因此,我们函数需要延时一会,等待系统完成resume就好了。一般延时1毫秒就可以了,但是我的app里面用到抽屉式导航栏,保存的时间要长点。

准备工作到这里已经结束了。只要activity集成自该父类,就会自动托管日间、夜间模式了

3调用方式

子类只要调用ChangeToDay、ChangeToNight就可以完成模式的切换了。别忘了recreate activity来生效哦,实例代码如下:

void changeViewMode() {

boolean isNight = getMyApplication().isNightMode();

if (isNight)

ChangeToDay();

else

ChangeToNight();

recreate();

}

OK,如过你能坚持看到这里,说明阁下是有耐心的人,奉上一个彩蛋。

关于WebView网页如何实现日间、夜间模式。

这个问题比我们现象的要简单的多。因为网页么,在生成html内容时,只要根据日间、还是夜间模式,替换css路径为日间.css、夜间.css就好了。

栗子来了,瞧,就是这个"{style}",我们要替换的对象。

Cnblogs

在对webview加载内容文本时,替换该字符串的css

replace("{style}",baseApplication.isNightMode() ? "style_night.css" : "style_day.css")

结构如下:

好了,大概思路,步骤代码都已经给出了,各位可以轻松给自己的app加上夜间模式

00分享举报

android studio夜间模式,android studio怎样实现夜间模式相关推荐

  1. android studio 实用指南,《Android Studio实用指南》4.27 使用演示模式(示例代码)

    本文节选自<Android Studio实用指南> 第4章第27节 作者: 毕小朋 目前本书已上传到百度阅读, 在百度中搜索[Anroid Studio实用指南]便可以找到本书. 什么是演 ...

  2. 基于Android studio设计的APP通过esp8266在AP模式下控制STM32单片机LED灯

    一.单片机硬件:mini板f103rct6. 显示屏TFT2.8寸.wifi模块esp8266(正点原子旗舰店购买) 关键代码: 模块AT指令配置进入ap模式: 相应的指令执行: 软件Android ...

  3. android studio云测,Android studio 下的robotium自动化测试和持续集成

    [背景介绍] Android Studio 是一个Android开发环境,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开 ...

  4. android studio管理依赖,Android Studio 中的 Gradle 依赖统一管理

    在我们的实际项目开发中,通常在一个 Project 项目中会存在多个 Module 的情况,在这些 Module 中会存在一些相同的版本依赖配置,针对进行版本升级的时候需要逐个修改,显得特别麻烦,所以 ...

  5. android studio 跨进程,Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用...

    本文首发于微信公众号「后厂技术官」 在上一篇文章Android IPC机制(二)用Messenger进行进程间通信中我们介绍了使用Messenger来进行进程间通信的方法,但是我们能发现Messeng ...

  6. android studio抛出,Android Studio中新的项目不能运行,抛出错误(Android Studio new pr

    刚才我已经安装,并开始在Android Studio中工作,并配置我需要开始上项目的工作一切之后创建的新项目. 在新创建的项目,我没有改变任何东西,然后试图运行项目. 但它不工作,抛出一些相关性错误, ...

  7. android studio(1)---探索Android Studio

    探索 Android Studio Android Studio 是基于 IntelliJ IDEA 的官方 Android 应用开发集成开发环境 (IDE). 除了 IntelliJ 强大的代码编辑 ...

  8. Ubuntu(Deepin)搭建Android开发环境(Android Studio)

    前言: 最近项目完成得差不多了,有些空闲于是装了基于ubuntu的Deepin玩玩,感觉挺好的,于是尝试用它来作为开发的系统,接下来就是要搭建android的开发环境,但是看了好多都是很老的,IDE是 ...

  9. Visual Studio中的Android模拟器使用详解

    关注微信号:javalearns   随时随地学Java 或扫一扫 随时随地学Java Microsoft 本周发布了 Visual Studio 2015 预览版, 里面包含 Android 开发工 ...

  10. android studio评论功能,Android Studio 使用技巧

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 作为一名 Android 开发者,使用 Android Studio 作为 IDE 进行开发已经成为标配,本文就把 AS ...

最新文章

  1. SQL Server 2014图文安装教程
  2. vim设置显示行号,vim跳转到文件头,文件尾
  3. 光栅衍射主极大个数_大学物理——光的干涉和衍射(二)
  4. c++输入了后边不继续_医疗:连涨多日,后边还能加仓吗?直接说答案!
  5. c# 对COM+对象反射调用时地址参数处理 c# 对COM+对象反射调用时地址参数处理
  6. 【计算机视觉】opencv姿态解算6 理论算法调研 PNP问题 5种算法
  7. vt linux tty中文,Linux输入子系统和tty关系影述
  8. c 语言 初始化数组,C CodeBase:初始化一个数组
  9. ADSL拨号网络环境下实时视频广播的完美实现
  10. python读取cad_SmartSoft中用C#.Net实现AutoCAD块属性提取|python基础教程|python入门|python教程...
  11. 基于HTML5实现五彩连珠小游戏
  12. 基于Verilog HDL的数字秒表
  13. Python实现图像的椒盐噪声添加和基础的平滑处理(均值滤波与中值滤波)
  14. 手机怎么把几个PDF文件合并到一起?教你一分钟搞定
  15. 别让猴子跳回背上——观书感
  16. Hulu推荐 | 五年口碑依旧百分百好评?《汉密尔顿》上线Disney+
  17. Apahce虚拟主机与伪静态
  18. 【雷达通信】相控阵天气雷达探测晴空回波能力分析Matlab源码
  19. 多路复用之——epoll
  20. 仓库温度湿度控制措施_仓库温湿度管理规定_仓库温湿度监测管理制度

热门文章

  1. rostopic发送cmd_vel指令
  2. IE打不开了,该怎么办?
  3. Java编程:随机生成数字串
  4. 手机应用游戏开发死机现场之一
  5. Java--实现简单的音频(mp3格式)播放
  6. ThingWorx布局
  7. python 图像分割_Python中的图像分割(第2部分)
  8. Win7下eclipse提交Job到hadoop集群
  9. 203.为用户定义的数据类型绑定默认值案例
  10. Java实现谷歌验证器