今天研究两个小功能
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标签通过正则表达式给过滤掉。至于太具体的,网页我也不会写,正则表达式也闹不明白。先就明白这原理吧。得去厕所了,今天先写这么多。