今天研究两个小功能

1.双击全屏功能。

2.网络内容去除图片功能。


首先呢。说个简单的小功能,在某一个试图界面下,通过手机的双击屏幕或者模拟器的双击鼠标实现全屏,以满足更好的阅读体验。

这个功能是怎么实现的呢?OsChina安卓客户端是这么做的,且听我娓娓道来。(感谢他们的开源精神)。

首先呢。有个基础是需要知道的,就是GestureDetector类。看名字就知道了,应该是手势识别相关的类。双击事件的监听就是通过它来实现的。

然后就贴代码了:

private void regOnDoubleEvent() {
		gd = new GestureDetector(this,
				new GestureDetector.SimpleOnGestureListener() {
					@Override
					public boolean onDoubleTap(MotionEvent e) {
						isFullScreen = !isFullScreen;
						if (!isFullScreen) {
							WindowManager.LayoutParams params = getWindow()
									.getAttributes();
							params.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
							getWindow().setAttributes(params);
							//允许窗口扩展到屏幕之外
							getWindow()
									.clearFlags(
											WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
							mHeader.setVisibility(View.VISIBLE);
							mFooter.setVisibility(View.VISIBLE);
						} else {
							WindowManager.LayoutParams params = getWindow()
									.getAttributes();
							params.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
							getWindow().setAttributes(params);
							getWindow()
									.addFlags(
											WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
							mHeader.setVisibility(View.GONE);
							mFooter.setVisibility(View.GONE);
						}
						return true;
					}
				});
	}




首先是这句

isFullScreen= !isFullScreen;

其实在代码最前面定义的时候,是没有给初值的,查了一下,javaboolean类型有false的默认值。

对于从C++转过来的我是感觉各种不习惯。这代码呢就是保证程序每次起来都会走else分支,然后下次再操作的时候进if分支,保证不会操作之后无任何反应。


接下来分析一下,这两句代码,写法好奇怪:

params.flags&= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
params.flags|= WindowManager.LayoutParams.FLAG_FULLSCREEN;

这是我跟踪调试的值
~25233152 &= 1024 = 25232128
25231616 |= 1024 = 25232640

什么玩意啊。不就是加法和减法吗?为什么要整的这么复杂呢?

我这么说的目的不是不相信OSChina的码农的水平。我只是希望有明白的看官骂我的无知,告诉我他们为什么要这么写。。。


至于别的就没什么好说的了。代码还是比较简单的。

对了,到这之后你会发现没起效果。

还差一个事件的分发:

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (isAllowFullScreen()) {
gd.onTouchEvent(event);
}
return super.dispatchTouchEvent(event);
}

接下来,咱们再一起研究一下网络内容去除图片功能。uc浏览器刚出来的时候,什么无图浏览之类的东西,对于那时候那丁点流量来说,还是很管用的,今天终于大概了解了实现这功能的简单原理(也许只是类似)

还是贴代码:



String body = UIHelper.WEB_STYLE + newsDetail.getBody();
					// 读取用户设置:是否加载文章图片--默认有wifi下始终加载图片
					boolean isLoadImage;
					AppContext ac = (AppContext) getApplication();
					if (AppContext.NETTYPE_WIFI == ac.getNetworkType()) {
						isLoadImage = true;
					} else {
						isLoadImage = ac.isLoadImage();
					}
					if (isLoadImage) {
						// 过滤掉 img标签的width,height属性
						body = body.replaceAll(
								"(<img[^>]*?)\\s+width\\s*=\\s*\\S+", "$1");
						body = body.replaceAll(
								"(<img[^>]*?)\\s+height\\s*=\\s*\\S+", "$1");

						// 添加点击图片放大支持
						body = body.replaceAll("(<img[^>]+src=\")(\\S+)\"",
								"$1$2\" onClick=\"javascript:mWebViewImageListener.onImageClick('$2')\"");

					} else {
						// 过滤掉 img标签
						body = body.replaceAll("<\\s*img\\s+([^>]*)\\s*>", "");
					}



目前我的理解呢,就是如果设置了无图模式呢,就把网页内容脚本中的img标签通过正则表达式给过滤掉。至于太具体的,网页我也不会写,正则表达式也闹不明白。先就明白这原理吧。得去厕所了,今天先写这么多。