国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android WebView實現長按保存圖片及長按識別二維碼功能

2019-10-22 18:17:09
字體:
來源:轉載
供稿:網友

先來簡單說一下本文所要實現的功能:用戶在瀏覽網頁的時候,長按某一區域,識別如果是圖片,則彈出彈框,出現保存圖片的功能。同時識別圖片是否是二維碼,如果是則在彈框中追加識別二維碼功能。

細節上:保存圖片的彈框要顯示在手指長按的位置;選擇圖片保存后,可以讓用戶直接去相冊查看;選擇識別二維碼,判斷是是不是網址,是的話可以讓用戶選擇復制或訪問,否則可以讓用戶選擇復制或搜索。

然后再來看一下效果圖:

保存圖片

android,webview,長按保存圖片,長按識別二維碼

save.gif

識別包含普通文字的二維碼:

android,webview,長按保存圖片,長按識別二維碼

text.gif

識別包含網址的二維碼:

android,webview,長按保存圖片,長按識別二維碼

code.gif

上述功能所用到的類和庫:

  • 獲得長按內容: WebView.HitTestResult
  • 彈框列表: DialogFragment
  • 圖片下載: Glide
  • 二維碼識別: Zxing
  •  

實現要點

記錄長按位置

繼承 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實現長按保存圖片長按識別二維碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 玉门市| 哈尔滨市| 包头市| 安康市| 同心县| 商水县| 宝应县| 宜川县| 潞城市| 东阿县| 沙田区| 淳化县| 邵武市| 衡东县| 潍坊市| 阿鲁科尔沁旗| 五寨县| 亚东县| 西乡县| 尚志市| 古田县| 抚远县| 榆社县| 乌海市| 新巴尔虎左旗| 安图县| 永修县| 封丘县| 华池县| 绥阳县| 榆中县| 大名县| 鲜城| 文山县| 青海省| 宾阳县| 尼勒克县| 新安县| 广州市| 义马市| 射阳县|