Android 的WebView長按保存圖片

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

慣例免積分代碼大放送。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章