Android 高级UI设计笔记24:Android 夜间模式之 WebView 实现白天 / 夜间阅读模式 (使用JavaScript)

1. 问题引入:

前面我们是使用方法 降低屏幕亮度(不常用) 和 替换theme,两者都是针对Activity的背景进行白天、夜间模式的交换,但是如果我们显示的是Html的内容,这个时候改怎么办?

分析:首先加载Html页面肯定是要用到WebView的,通过loadUrl的方法可以把html页面显示到webView,我们知道Android可以与JavaScript进行交互,就是说可以在JavaScript中调用Android的代码,也可以在Android中调用JavaScript代码。

所以就有了一个思路就是,通过Android调用Html页面中的JavaScript代码来控制页面背景和字体样式来达到切换白天/黑夜模式

2. 案例演示:

(1)首先创建一个Android工程如下:

(2)首先我们提供一个Html文件用来测试,为source.html,存放在assets文件夹下:

 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd";>
 2 <html>
 3 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 4 <script language=javascript>
 5 function load_night()
 6 {
 7
 8     document.bgColor="#000000"
 9     var fontColor = document.getElementById("font");
10     if (!fontColor) {
11     return;
12     }
13     fontColor.style.color="white"
14 }
15 </script>
16
17 <script language="javascript">
18     function load_day(){
19         document.bgColor="#ffffff"
20         var fontColor = document.getElementById("font");
21     if (!fontColor) {
22         return;
23         }
24     fontColor.style.color="black"
25     }
26 </script>
27 <head>
28 <title>webView测试夜间模式</title>
29 </head>
30
31 <body LEFTMARGIN="10" VLINK="#8000FF" BGCOLOR="#FFFFFF" ALINK="#FF0000" LINK="#0000FF"
32 TOPMARGIN="10" TEXT="#666666">
33     <div id="font">问世间情为何物,直教人生死相许</div>
34     </br>
35     <button type="button" onClick="load_night()">夜间模式</button>
36     <button type="button" onClick="load_day()">白天模式</button>
37 </body>
38 </html>

这个Html布局为:

(3)来到主Activity,如下:

 1 package com.himi.webview;
 2
 3 import android.app.Activity;
 4 import android.content.Intent;
 5 import android.net.Uri;
 6 import android.os.Bundle;
 7 import android.view.KeyEvent;
 8 import android.view.View;
 9 import android.view.View.OnClickListener;
10 import android.webkit.WebSettings;
11 import android.webkit.WebView;
12 import android.webkit.WebViewClient;
13 import android.widget.Button;
14
15 public class MainActivity extends Activity implements OnClickListener {
16
17     private WebView webView;
18     private Button nightModeBtn;
19     private Button lightModeBtn;
20
21     @Override
22     protected void onCreate(Bundle savedInstanceState) {
23         super.onCreate(savedInstanceState);
24         setContentView(R.layout.activity_main);
25
26         webView = (WebView) this.findViewById(R.id.webview);
27         nightModeBtn = (Button) this.findViewById(R.id.btn_nightmode);
28         lightModeBtn = (Button) this.findViewById(R.id.btn_lightmode);
29
30         nightModeBtn.setOnClickListener(this);
31         lightModeBtn.setOnClickListener(this);
32
33         // webView.loadUrl("http://www.baidu.com");
34
35         WebSettings settings = webView.getSettings();
36         // 设置javaScript可用
37         settings.setJavaScriptEnabled(true);
38
39         // 绑定javaScript接口,可以实现在javaScript中调用我们的Android代码
40         // webView.addJavascriptInterface(new WebAppInterface(this), "Android");
41         // webView.setWebViewClient(new MyWebViewClient());
42
43         // 加载assets目录下的html页面
44         webView.loadUrl("file:///android_asset/source.html");
45
46     }
47
48     /**
49      * 用于控制页面导航
50      *
51      * @author hebao
52      *
53      */
54 //    private class MyWebViewClient extends WebViewClient {
55 //        /**
56 //         * 当用于点击链接,系统调用这个方法
57 //         */
58 //        @Override
59 //        public boolean shouldOverrideUrlLoading(WebView view, String url) {
60 //            if (Uri.parse(url).getHost().equals("www.baidu.com")) {
61 //                // 这个是我的网页,所以不要覆盖,让我的WebView来加载页面
62 //                return false;
63 //            }
64 //            // 否则,这个链接不是我的网站页面,因此启用浏览器来处理urls
65 //            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
66 //            startActivity(intent);
67 //            return true;
68 //        }
69 //    }
70
71     @Override
72     public boolean onKeyDown(int keyCode, KeyEvent event) {
73         // 检查是否为返回事件,如果有网页历史记录
74         if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {
75             webView.goBack();
76             return true;
77         }
78         // 如果不是返回键或没有网页浏览历史,保持默认
79         // 系统行为(可能会退出该活动)
80         return super.onKeyDown(keyCode, event);
81     }
82
83     @Override
84     public void onClick(View v) {
85         //Android调用javascript代码
86         switch (v.getId()) {
87         case R.id.btn_nightmode:
88             webView.loadUrl("javascript:load_night()");
89             break;
90         case R.id.btn_lightmode:
91             webView.loadUrl("javascript:load_day()");
92             break;
93
94         default:
95             break;
96         }
97     }
98 }

上面有必要说明一点:

(1)Android读取assets文件目录下的文件:

  • 资源文件 sample.txt 位于 $PROJECT_HOME/assets/ 目录下,可以在 Activity 中通过 Context.getAssets().open("sample.txt") 方法获取输入流。
  • 资源文件 sample.html 位于 $PROJECT_HOME/assets/ 目录下,可以通过以下代码
    WebView.loadUrl("file:///android_asset/sample.html"); 
    加载html文件。

部署程序到手机上,如下:

本文示例代码下载地址:http://download.csdn.net/detail/hebao5201314/9591112

时间: 2024-08-24 18:49:41

Android 高级UI设计笔记24:Android 夜间模式之 WebView 实现白天 / 夜间阅读模式 (使用JavaScript)的相关文章

Android 高级UI设计笔记11:Gallery(画廊控件)之Gallery基本使用

1. 这里要向大家介绍Android控件Gallery(画廊控件) Gallery控件主要用于横向显示图像列表,不过按常规做法.Gallery组件只能有限地显示指定的图像.也就是说,如果为Gallery组件指定了10张图像,那么当Gallery组件显示到第10张时,就不会再继续显示了. 2. Gallery基本用法: 步骤如下: (1)首先我们新建一个Android工程,工程目录如下: (2)activity_main.xml(主布局文件),如下: 在activity_main.xml添加Ima

Android 高级UI设计笔记23:Android 夜间模式之 两种常用方法(降低屏幕亮度+替换theme)

1. 夜间模式 所谓的夜间模式,就是能够根据不同的设定,呈现不同风格的界面给用户,而且晚上看着不伤眼睛.特别是一些新闻类App实现夜间模式是非常人性化的,增强用户体验. 2. 我根据网上的资料 以及自己代码亲测,总结如下两种方法: (1)降低屏幕亮度 (2)替换theme 3. 夜间模式之 降低屏幕亮度: (1)创建一个Android工程,命名为"夜间模式_利用屏幕亮度(App)",如下: (2)首先我们来到主布局之中,如下: 1 <LinearLayout xmlns:andr

Android 高级UI设计笔记06:仿微信图片选择器

仿微信图片选择器: 一.项目整体分析: 1. Android加载图片的3个目标: (1)尽可能的去避免内存溢出. a. 根据图片的显示大小去压缩图片 b. 使用缓存对我们图片进行管理(LruCache) (2)用户操作UI控件必须充分的流畅. a. getView里面尽可能不去做耗时的操作(异步加载 + 回调显示) (3)用户预期显示的图片尽可能的快(图片的加载策略的选择,一般选择是LIFO). a. LIFO 2. 定义一个Imageloader完成上面1中的3个目标: Imageloader

Android 高级UI设计笔记19:PopupWindow使用详解

1. PopupWindow使用 PopupWindow这个类用来实现一个弹出框,可以使用任意布局的View作为其内容,这个弹出框是悬浮在当前activity之上的. 2. PopupWindow使用的案例: (1)首先是我们弹出框的布局设计,如下: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.

Android 高级UI设计笔记12:ImageSwitcher图片切换器

1. ImageSwitcher ImageSwitcher是Android中控制图片展示效果的一个控件,如:幻灯片效果...,颇有感觉啊.做相册一绝 2. 重要方法 setImageURI(Uri uri):设置图片地址 setImageResource(int resid):设置图片资源库 setImageDrawable(Drawable drawable):绘制图片 3. 设置动画效果 imageSwitcher.setInAnimation(AnimationUtils.loadAni

Android 高级UI设计笔记22:Android 指示引导页(带圆点)

1. 引导页: 我们在安装某个软件首次运行时,大部分都会有一个引导页的提示,介绍软件新功能的加入或者使用说明等,支持滑动且下面会有几个圆点,显示共有多少页和当前图片的位置,类似如下效果: 2. 引导页具体实现功能如下: 可以左右滑动图片. 图片的索引圆点显示,看出当前图片所在的位置和图片的数量. 可任意左右滑动. 图片的索引圆点带有动画效果. 最后一页显示按钮,点击进入应用. 3. 引导页实现逻辑过程: 利用ViewPager实现用户引导界面. 在这里,我们需要用到google提到的一个支持包—

Android 高级UI设计笔记20:RecyclerView 的详解之RecyclerView添加Item点击事件

1. 引言: RecyclerView侧重的是布局的灵活性,虽说可以替代ListView但是连基本的点击事件都没有,这篇文章就来详细讲解如何为RecyclerView的item添加点击事件,顺便复习一下观察者模式. 2. 最终目的 模拟ListView的setOnItemClickListener()方法,调用者只须调用类似于setOnItemClickListener的东西就能获得被点击item的相关数据.   3. 原理 为RecyclerView的每个子item设置setOnClickLi

Android 高级UI设计笔记09:Android如何实现无限滚动列表

ListView和GridView已经成为原生的Android应用实现中两个最流行的设计模式.目前,这些模式被大量的开发者使用,主要是因为他们是简单而直接的实现,同时他们提供了一个良好,整洁的用户体验. 对于ListView和GridView一个共同基本要求是:当用户向下滚动时可以动态加载数据支持无限滚动.下面教你如何在自己的应用中实现这个特性. 具体流程如下: (1)我们需要的一个主要组件是InfiniteScrollListener类,它实现了OnScrollListener接口.让我们直接

Android 高级UI设计笔记08:Android开发者常用的7款Android UI组件(转载)

Android开发是目前最热门的移动开发技术之一,随着开发者的不断努力和Android社区的进步,Android开发技术已经日趋成熟,当然,在Android开源社区中也涌现了很多不错的开源UI项目,它们可以帮助Android开发者更方便快捷地完成想要的功能.本文是Android系列的第一篇,主要是向大家推荐一些常用的Android UI组件,它们都是开源的. 1.图表引擎 -  AChartEngine AChartEngine是一款基于Android的图表绘制引擎,它为Android开发者提供