时间:2个星期之久
工作进度缓慢,android起步。。。
本次项目为交行app,新闻内容页面采用url方式引用,牵涉到一系列关于webview的问题,其实一直在
copy,整合别人的经验而已。
首先,采用url方式的可行性。一开始考虑到的是页面缓存问题,采用html(url)方式,缓存之后,新
闻内容页的图片路径问题。网页上,图片地址或相对或绝对,在缓存本地之后,路径问题如何解决。以前
没有这类问题,从这个问题上我发现我解决问题的思路不对,首先面对url方式,我不是考虑到可行性的问
题上,而是直接上手,在全局的考虑上没有大局观念。面对一个需求重要的是轮廓,继而添枝加叶。
对于这个考虑,我是按照我错误的思路实践下逼出来的方法,webview与javascript的交互的知识点下手
,给webview添加js监听事件,返回html字符串,替换img的路径,然后根据自己的路径保存图片,解决问
题。
启用javascript
contentWebView.getSettings().setJavaScriptEnabled(true);
设置js监听事件
contentWebView.addJavascriptInterface(new InJavaScriptLocalObj(), "local_obj");
重写MyWebViewClient方法
@Override
public void onPageFinished(WebView view, String url) {
view.getSettings().setJavaScriptEnabled(true);
super.onPageFinished(view, url);
// html加载完成之后,添加监听图片的点击js函数
addImageClickListner();
view.loadUrl("javascript:(function(){" +
"var objs = document.getElementsByTagName(\"img\"); " +
"var arr=new Array(); " +
"if(objs.length>0){" +
"for(var i=0;i<objs.length;i++) " +
" {" +
" arr[i]=objs[i].src;"
+ " } " +
"var str=arr.join(\",\");" +
"function Image(){window.cache_image.cacheimage(str);}" +
" Image();}" +
"})()");
view.loadUrl("javascript:window.local_obj.showSource('<head>'+" +
"document.getElementsByTagName('html')[0].innerHTML+'</head>');");
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
view.getSettings().setJavaScriptEnabled(true);
super.onPageStarted(view, url, favicon);
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String
failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
}
}
通过imageview.addUrl()方法添加方法格式如上
js:
contentWebView.loadUrl("javascript:(function(){" +
"var objs = document.getElementsByTagName(\"img\"); " +
"for(var i=0;i<objs.length;i++) " +
"{"
+ " objs[i].onclick=function() " +
" { "
+ " window.imagelistner.openImage(this.src); " +
" } " +
"}" +
"})()");
js可以在html上实验后再拿过来。
图片的缩放、旋转
思路:
把图片传到一个新的activity中,此activity背景半透明。实现OnTouchListener接口
imgview.setOnTouchListener(this);
imgview.setLongClickable(true);
View 里面有个setLongClickable(boolean longClickable)的方法,意思是说是否要启用长按功能。
true 是让设备支持长按,false是不支持。设为true的时候MotionEvent.ACTION_UP就能监听到了!
重写onTouch方法
此方法有2个参数View v, MotionEvent event
v是操作对象,event是动作事件
switch (event.getActionMasked()) {//判断动作
case MotionEvent.ACTION_DOWN:// 一个点按下去了
matrix.set(imgview.getImageMatrix());
savedMatrix.set(matrix);
start.set(event.getX(), event.getY());//此时接触的点记录为(PointF)
start开始点 Log.d("Infor", "触摸了...");
mode = DRAG;
break;
case MotionEvent.ACTION_POINTER_DOWN: // 多点触控
oldDist = this.spacing(event);//计算2点间的距离,若距离大于10f,则判
定为多点
if (oldDist > 10f) {
Log.d("Infor", "oldDist" + oldDist);
savedMatrix.set(matrix);
midPoint(mid, event);//计算两点间的距离的中点
old.set(event.getX(1), event.getY(1));//此时两点间第二个点记
录为old点,用于图片旋转
mode = ZOOM;
}
break;
case MotionEvent.ACTION_POINTER_UP://第二个点拿起
mode = NONE;
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) { // 此实现图片的拖动功能...
matrix.set(savedMatrix);
matrix.postTranslate(event.getX() - start.x, event.getY()
- start.y);//postTranslate拖动方法
} else if (mode == ZOOM) {// 此实现图片的缩放功能...
now.set(event.getX(1), event.getY(1));缩放过程中第二个点旋转
,这个店一直变化,记录为now点用于旋转
float newDist = spacing(event);//计算两点间距离
if (newDist > 10) {
float angle=degree(mid,event);
matrix.set(savedMatrix);
float scale = newDist / oldDist;
matrix.postScale(scale, scale, mid.x, mid.y);
matrix.postRotate(angle, mid.x, mid.y);
}
}
break;
}
imgview.setImageMatrix(matrix);
再者是最终要的缓冲问题,
思路:保存所有数据到本地文件夹,从中读取。——————————》内存缓冲去了解!!!!
页面html再修改img路径后写入本地创建好的文件中,以图片名字为名,创建的html文件。
页面图片的点击事件的获取
private void addImageClickListner() {
// 这段js函数的功能就是,遍历所有的img几点,并添加onclick函数,函数的功能是在图片点击
的时候调用本地java接口并传递url过去
contentWebView.loadUrl("javascript:(function(){" +
"var objs = document.getElementsByTagName(\"img\"); " +
"for(var i=0;i<objs.length;i++) " +
"{"
+ " objs[i].onclick=function() " +
" { "
+ " window.imagelistner.openImage(this.src); " +
" } " +
"}" +
"})()");
}
MyWebViewClient中
addImageClickListner();
contentWebView.addJavascriptInterface(new JavascriptInterface(this), "imagelistner");
第一次加载url时缓存所有的图片
同样是添加js时间
重点是js语句的学习
android 文件写入
File myCaptureFile = new File(ALBUM_PATH+nid+".html");
try {
BufferedOutputStream bos = new BufferedOutputStream(new
FileOutputStream(myCaptureFile));
//将要写入的字符串转换为byte数组
byte[] bytes = s1.getBytes();
bos.write(bytes);//将byte数组写入文件
bos.close();//关闭文件输出流
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
new Handler().postDelayed(new Runnable() {
public void run() {
Intent intent = new Intent();
intent.setClass(MainActivity.this, MainLoginActivity.class);
startActivity(intent);
MainActivity.this.finish();
}
}, 3000);
分享到:
相关推荐
live 版本2013.10.18 windows vs2010 编译的整个工程文件,含编译脚本,参考http://www.cnblogs.com/skyseraph/archive/2012/04/11/2442840.html
8. 18.160.0.0 9. 内部和外部 10. 差错报告,询问 11. 链路状态 【名词解释】 1. UTP - Unshielded Twisted Pair,非屏蔽双绞线 2. SONET - Synchronous Optical Networking,同步光网络 3. CIDR - Classless Inter...
Harmony 18 The process object 19 The Read-Eval-Print Loop and executing a Node program 21 Summary 23 Chapter 2: Understanding Asynchronous Event-Driven Programming 25 Broadcasting events 26 ...
基本功能: 已经在程序中集成支付宝(担保交易/双功能接口/即时到帐)、银联、paypal、财付通、微信支付(扫码支付)、个人免签约支付...支持支付宝即时到帐与双功能接口,银联支付,paypal贝宝支付(v1.0 2013.11.10)
web前端开发参考手册系列之 CSS参考手册 版本:v4.1.0 最后更新时间:2013.11.18 编著:飘零雾雨
上述文件"嵌入式系统课程设计2013.5.pdf"列举了一系列基于单片机的项目设计,这些设计展示了嵌入式系统在不同领域的应用和技术实践。 1. **汽车模型设计**:全自动驾驶汽车模型的设计制作涉及到车辆控制算法、...
在压缩包中,“简单带宽叠加v2013.11.18.bat”可能是该软件的执行文件,用户运行这个批处理文件来启动服务。批处理文件是Windows操作系统中的一种脚本文件,通常包含一系列命令,用于自动化特定任务。 另一个文件...
gcc4core-4.8.0,REV=2013.03.29-SunOS5.10-i386-CSW.pkg.gz libmpfr4-3.1.2,REV=2014.03.18-SunOS5.10-i386-CSW.pkg.gz gcc4g++-4.8.0,REV=2013.03.29-SunOS5.10-i386-CSW.pkg.gz libncurses5-5.9,REV=2011.11.21-...
18. **习题5.17**:对地址序列的表述进行了修正。 19. **图6-7**:更新了相关图形。 20. **波特率单位**:在通信速率的单位上,将“波特/秒”更正为“波特”。 21. **图6-47和例6.4**:修正了异步串行通信中数据...
boost-program-options-1.41.0-18.el6.x86_64.rpm btrfs-progs-0.20-0.2.git91d9eec.el6.x86_64.rpm celt051-0.5.1.3-0.el6.x86_64.rpm crudini-0.3-2.el6.noarch.rpm cvs-1.11.23-16.el6.x86_64.rpm cyrus-sasl-...
18. Overloading ................................................................................. 527 19. Special Operators ........................................................................ 549...
18. **谐波鉴幅**:利用人工神经网络分析电力系统的谐波成分。 19. **鱼用投饵机**:自动控制饲料投放,提高水产养殖效率。 20. **调压调速系统仿真**:在MATLAB环境中对控制系统进行建模和仿真。 21. **无刷直流...
18. **802.11y**:扩展了802.11a的工作频段,包括36-48GHz的频段。 19. **802.11z**:可能包含对现有标准的补充或更新,具体细节可能在文档中详细阐述。 这些协议的不断发展和完善,不仅提升了Wi-Fi的速度,还增强...
boost-program-options-1.41.0-18.el6.x86_64.rpm btrfs-progs-0.20-0.2.git91d9eec.el6.x86_64.rpm celt051-0.5.1.3-0.el6.x86_64.rpm crudini-0.3-2.el6.noarch.rpm cvs-1.11.23-16.el6.x86_64.rpm cyrus-sasl-...
18. 节肢动物与疾病传播:某些节肢动物如蚊子和蜱能传播疾病。 19. 鱼离开水死亡的原因:鱼类通过鳃进行呼吸,离开水后鳃会干燥导致无法呼吸。 20. 两栖动物的识别:青蛙是典型的两栖动物,而蜥蜴是爬行动物。 21...
18. 磁盘属于外存储器,包括硬盘和软盘等。 19. 3.5英寸软盘上的小方孔滑块用于写保护,防止数据被意外修改。 20. CD-ROM是只读光盘,常用于存储大量数据,如软件、音乐等。 21. 气象预报属于数值计算应用领域,涉及...
v2013.12.10 add some info for Simocode v12 // MD5: 10a0c74548ba89b80e98f2664289ba79 v2013.12.02 add some info for PDM v8.1 v2013.12.01 add some info for Softnet Security Client v4.0 v2013.05.26 add ...
18. switch语句:与if语句功能等价的switch语句是D),因为if语句中的条件是a==1,而switch语句中case 1对应这个条件。 19. 嵌套if语句:与嵌套if语句等价的语句是A),使用了三元运算符来实现相同的逻辑。 以上是...