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"/>

惯例免积分代码大放送。

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