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

首頁 > 系統 > Android > 正文

Android使用WebView實現截圖分享功能

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

在APP項目的開發過程中,經常會用到分享圖片的功能,有時候還需要根據當前用戶信息獲取指定的分享圖片,比如要求在用戶分享圖中顯示用戶名、Uid、用戶頭像等信息。想到的實現方法主要有兩點:

1.通過android SDK自帶的Canvas方法進行繪制。
2.通過webView實現客戶端與H5交互,然后將H5界面做截圖處理。

本文主要介紹第二種方式的實現過程,第一種方式的實現方法,后續有時間會在博客中做說明,下面開始本文內容。
首先確定我們要實現的邏輯:

1.客戶端與H5的交互,客戶端將用戶信息(用戶名、Uid、用戶頭像等)發送給H5;

2.客戶端截取WebView功能的實現;

3.分享功能的添加。

1.客戶端與H5交互

在界面布局中添加webView布局,對WebView布局進行初始化操作(此處需要網絡權限,不做單獨處理)

wv_imgweb = (WebView) findViewById(R.id.h5_wv_imgweb);

 

WebSettings webSettings = wv_imgweb.getSettings();//此處可更加具體的H5界面功能進行相應的WebSettings設置,本文只是演示基本效果    webSettings.setJavaScriptEnabled(true);    webSettings.setSupportZoom(false);     wv_imgweb.requestFocusFromTouch();    wv_imgweb.setDrawingCacheEnabled(true);    wv_imgweb.setVerticalScrollBarEnabled(false);    wv_imgweb.setHorizontalScrollBarEnabled(false);    wv_imgweb.setVerticalScrollbarOverlay(false);    wv_imgweb.setHorizontalScrollbarOverlay(false);    wv_imgweb.setWebViewClient(new WebViewClient() {      @Override      public boolean shouldOverrideUrlLoading(WebView view, String url) {        view.loadUrl(url);        return true;      }      @Override      public void onPageFinished(WebView view, String url) {        super.onPageFinished(view, url);        //加載邏輯的處理      }      @Override      public void onPageStarted(WebView view, String url, Bitmap favicon) {        super.onPageStarted(view, url, favicon);        //加載邏輯的處理      }    });//添加用戶信息參數,加載H5分享地址wv_imgweb.loadUrl(h5_url);

2.截圖功能的實現

上文中的WebView頁面加載完成后,即可調用截圖功能,并將圖片保存在本地指定文件夾(此處需要存儲權限,不做單獨處理)
android中WebView可以通過多種方式實現截圖,下面分別做不同介紹:

2.1截取屏幕內內容

第一種方式是通過Bitmap bitmap = webView.getDrawingCache()截取屏幕內顯示內容,注意調用此方法setDrawingCacheEnabled(true)必須設置為true;

2.2截取整個WebView內容

第二種方式是通過Picture snapShot = wv_imgweb.capturePicture()來截取整個WebView的內容

Picture snapShot = wv_imgweb.capturePicture();if (snapShot != null && snapShot.getWidth() > 0 && snapShot.getHeight() > 0) {   Bitmap bitmap = Bitmap.createBitmap(snapShot.getWidth(), snapShot.getHeight(), Bitmap.Config.ARGB_8888);//設置相應的圖片質量   Canvas canvas = new Canvas(bitmap);   snapShot.draw(canvas);//將截取的圖片保存到本地try {   File appFile = new File(Environment.getExternalStorageDirectory() + "/testpic/app");   if (!appFile.exists() && !appFile.isDirectory()) {     appFile.mkdirs();   }   String fileName = Environment.getExternalStorageDirectory().getPath() + "/testpic/app/share.jpg";   FileOutputStream fos = new FileOutputStream(fileName);   //設置保存本地圖片質量   bitmap.compress(Bitmap.CompressFormat.JPEG, 70, fos);   fos.close();   } catch (Exception e) {     UIUtils.setLogInfo("eee", e.getMessage());   }}

2.3截取整個WebView內容

Android 為了提高各方面的繪制速度(如滾動操作),為每一個 View 建立一個緩存,使用 View.buildDrawingCache 為自己的 View 建立相應的緩存, 這個 cache 就是一個 bitmap 對象。利用這個功能可以對整個屏幕視圖進行截屏并生成 Bitmap ,也可以獲得指定的 View 的 Bitmap 對象。

wv_imgweb.measure(View.MeasureSpec.makeMeasureSpec(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED),        View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));    wv_imgweb.layout(0, 0, wv_imgweb.getMeasuredWidth(), wv_imgweb.getMeasuredHeight());    wv_imgweb.setDrawingCacheEnabled(true);    wv_imgweb.buildDrawingCache();    Bitmap longImage = Bitmap.createBitmap(wv_imgweb.getMeasuredWidth(),        wv_imgweb.getMeasuredHeight(), Bitmap.Config.ARGB_8888);    Canvas canvas = new Canvas(longImage); // 畫布的寬高和 WebView 保持一致    Paint paint = new Paint();    canvas.drawBitmap(longImage, 0, wv_imgweb.getMeasuredHeight(), paint);    wv_imgweb.draw(canvas);    //將截取的圖片保存到本地    try {      File appFile = new File(Environment.getExternalStorageDirectory() + "/testpic/app");      if (!appFile.exists() && !appFile.isDirectory()) {        appFile.mkdirs();      }      String fileName = Environment.getExternalStorageDirectory().getPath() + "/testpic/app/share.jpg";      FileOutputStream fos = new FileOutputStream(fileName);      longImage.compress(Bitmap.CompressFormat.JPEG, 70, fos);      fos.close();    } catch (Exception e) {      UIUtils.setLogInfo("eee", e.getMessage());    }

問題:在5.0+上會發現,截取的快照只顯示了webview中顯示出來的那部分,沒有顯示出來的部分是空白的。通過google找到了原因,在5.0+版本上,Android對webview做了優化,旨在減少內存占用以提高性能。因此在默認情況下會智能的繪制html中需要繪制的部分,其實就是當前屏幕展示的html內容,因此會出現未顯示的圖像是空白的。解決辦法是調用enableSlowWholeDocumentDraw()方法。這個方法需要在webview創建之前調用,在Activity里就是在setContentView前去調用,此方法會有顯著的性能開銷。

3.分享圖片

通過原生或第三方分享功能,將上述生成的圖片添加到代碼中,完成分享。
如果有不同的見解,歡迎留言指正。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 济源市| 夹江县| 岢岚县| 横山县| 龙海市| 嘉善县| 玉屏| 潢川县| 米易县| 博野县| 吉安县| 天峨县| 天水市| 抚顺市| 铁岭县| 大化| 新竹县| 桃园市| 揭东县| 朔州市| 瓮安县| 盘山县| 南宁市| 南充市| 天峻县| 通河县| 荔浦县| 阜平县| 拜泉县| 平顺县| 广平县| 浦县| 洞头县| 松江区| 布尔津县| 河源市| 景谷| 伊金霍洛旗| 昌邑市| 水富县| 松溪县|