根据业务需要,WebView上经常会用到长按保存图片的功能,现在做一个Demo,希望能够帮到有用的童鞋。点哪里菜单就从哪里出来。so easy。
首先根据下面代码获取WebView上触发事件的位置座标,用于弹出菜单的显示位置:
mWebView.setOnTouchListener(listener);
// 获取手指点击事件的xy座标
View.OnTouchListener listener = new View.OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
downX = (int) arg1.getX();
downY = (int) arg1.getY();
return false;
}
};
核心代码如下:
mWebView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
WebView.HitTestResult result = ((WebView)v).getHitTestResult();
if (null == result)
return false;
int type = result.getType();
if (type == WebView.HitTestResult.UNKNOWN_TYPE)
return false;
if (type == WebView.HitTestResult.EDIT_TEXT_TYPE) {
}
// 相应长按事件弹出菜单
itemLongClickedPopWindow = new ItemLongClickedPopWindow(MainActivity.this,
ItemLongClickedPopWindow.IMAGE_VIEW_POPUPWINDOW,
SizeUtil.dp2px(mContext, 120), SizeUtil.dp2px(mContext, 90));
// 这里可以拦截很多类型,我们只处理图片类型就可以了
switch (type) {
case WebView.HitTestResult.PHONE_TYPE: // 处理拨号
break;
case WebView.HitTestResult.EMAIL_TYPE: // 处理Email
break;
case WebView.HitTestResult.GEO_TYPE: // TODO
break;
case WebView.HitTestResult.SRC_ANCHOR_TYPE: // 超链接
break;
case WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE:
break;
case WebView.HitTestResult.IMAGE_TYPE: // 处理长按图片的菜单项
// 获取图片的路径
saveImgUrl = result.getExtra();
//通过GestureDetector获取按下的位置,来定位PopWindow显示的位置
itemLongClickedPopWindow.showAtLocation(v, Gravity.TOP|Gravity.LEFT, downX, downY + 10);
break;
default:
break;
}
// 项目中有两个菜单(菜单一:查看图片),项目中我使用了Glide+PhotoView实现
itemLongClickedPopWindow.getView(R.id.item_longclicked_viewImage)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
itemLongClickedPopWindow.dismiss();
Intent intent = new Intent(mContext, ShowImgActivity.class);
intent.putExtra("info", saveImgUrl);
startActivity(intent);
}
});
// 菜单二:AsyncTask保存图片
itemLongClickedPopWindow.getView(R.id.item_longclicked_saveImage)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
itemLongClickedPopWindow.dismiss();
new SaveImage().execute();
}
});
return true;
}
});
查看图片界面:
最后要记得在清单文件添加权限申明:
<!-- 访问网络 -->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- 照片涉及到文件读写 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>