根據業務需要,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"/>