您好,登錄后才能下訂單哦!
先來簡單說一下本文所要實現的功能:用戶在瀏覽網頁的時候,長按某一區域,識別如果是圖片,則彈出彈框,出現保存圖片的功能。同時識別圖片是否是二維碼,如果是則在彈框中追加識別二維碼功能。
細節上:保存圖片的彈框要顯示在手指長按的位置;選擇圖片保存后,可以讓用戶直接去相冊查看;選擇識別二維碼,判斷是是不是網址,是的話可以讓用戶選擇復制或訪問,否則可以讓用戶選擇復制或搜索。
然后再來看一下效果圖:
保存圖片
save.gif
識別包含普通文字的二維碼:
text.gif
識別包含網址的二維碼:
code.gif
上述功能所用到的類和庫:
實現要點
記錄長按位置
繼承 WebView 記錄觸摸位置:
@Override public boolean onInterceptTouchEvent(MotionEvent event) { touchX = (int) event.getRawX(); touchY = (int) event.getRawY(); return super.onInterceptTouchEvent(event); }
彈框我選擇 DialogFragment 而不是 poupwindow 的原因是 poupwindow 的顯示通常需要依托另一個View,而且在7.0以上有兼容問題。
判斷長按位置的內容類型是否是圖片:
獲取圖片信息
setOnLongClickListener(new View.OnLongClickListener() { public boolean onLongClick(View v) { WebView.HitTestResult result = getHitTestResult(); if (null == result) return false; int type = result.getType(); switch (type) { case WebView.HitTestResult.EDIT_TEXT_TYPE: // 選中的文字類型 break; case WebView.HitTestResult.PHONE_TYPE: // 處理撥號 break; case WebView.HitTestResult.EMAIL_TYPE: // 處理Email break; case WebView.HitTestResult.GEO_TYPE: // 地圖類型 break; case WebView.HitTestResult.SRC_ANCHOR_TYPE: // 超鏈接 break; case WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE: // 帶有鏈接的圖片類型 case WebView.HitTestResult.IMAGE_TYPE: // 處理長按圖片的菜單項 String url = result.getExtra(); if (mOnSelectItemListener != null && url != null && URLUtil.isValidUrl(url)) mOnSelectItemListener.onSelected(touchX, touchY, result.getType(), url); } return true; case WebView.HitTestResult.UNKNOWN_TYPE: //未知 break; } return false; } });
在手指長按位置處彈出彈框
HitTestResult 是一個實體類,只記錄兩個信息:當選選擇內容的類型和內容的具體值。可以看到通過 WebView.HitTestResult ,我們可以獲得除了圖片外的很多內容類型。當然這里我們只需要判斷是否是圖片就好了,然后將長按位置和url一起回調給外層。在手指長按處顯示彈框,主要就是 DialogFragment 顯示位置的設定了:
public void onStart() { super.onStart(); Dialog dialog = getDialog(); if (dialog != null) { Window window = dialog.getWindow(); if (window != null) { WindowManager.LayoutParams lp = window.getAttributes(); window.setGravity(Gravity.LEFT | Gravity.TOP); lp.x = LocationX;//橫坐標位置 lp.y = LocationY;//縱坐標位置 lp.width = UIHelper.dip2px(100); lp.dimAmount = 0.0f;//外層背景透明,默認變暗 lp.width = ViewGroup.LayoutParams.WRAP_CONTENT; lp.height = ViewGroup.LayoutParams.WRAP_CONTENT; window.setAttributes(lp); window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));//內部背景透明 } } }
保存到相冊
利用 Glide 下載圖片, Glide 自帶預加載和圖片緩存功能,不需要每次都從網絡中下載:
GlideApp.with(appContext).asFile().load(url).submit().get();
可以在長按識別出圖片的時候就行預加載:
GlideApp.with(appContext).asBitmap().load(url).preload();
將圖片保存在相冊:
public static void displayToGallery(Context context, File photoFile) { if (photoFile == null || !photoFile.exists()) { return; } String photoPath = photoFile.getAbsolutePath(); String photoName = photoFile.getName(); // 把文件插入到系統圖庫 try { ContentResolver contentResolver = context.getContentResolver(); MediaStore.Images.Media.insertImage(contentResolver, photoPath, photoName, null); } catch (FileNotFoundException e) { e.printStackTrace(); } // 最后通知圖庫更新 context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + photoPath))); }
識別圖片中的二維碼
顯示彈框的同時還要判斷圖片是否包含二維碼,這部分就是 Zxing 自帶的功能,所以代碼就不貼了。注意不應該等是 Zxing 判斷是不是二維碼后再顯示彈框,因為這部分操作耗時可能比較長(見圖二)。應當在識別二維碼內容后再去更新彈框列表的內容。
總結
總體來說這個功能實現注意的地方還是挺多的,好在都不復雜。當然本例還存在待優化的地方,以及實現更高級的功能,比如以圖搜圖,查看大圖功能,也可以利用 WebView.HitTestResult 對獲取到其他類型的內容進行處理,限于篇幅就不再展開了。
最后貼下本項目github地址,對 WebView 感興趣的可以了解下:
github
總結
以上所述是小編給大家介紹的Android WebView實現長按保存圖片及長按識別二維碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。