今天就跟大家聊聊有關(guān)怎么在Android中使用WebView實現(xiàn)截圖分享功能,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
成都創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務領(lǐng)域包括:網(wǎng)站建設、成都網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的開化網(wǎng)站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡建設合作伙伴!
1.通過android SDK自帶的Canvas方法進行繪制。
2.通過webView實現(xiàn)客戶端與H5交互,然后將H5界面做截圖處理。
本文主要介紹第二種方式的實現(xiàn)過程,第一種方式的實現(xiàn)方法,后續(xù)有時間會在博客中做說明,下面開始本文內(nèi)容。
首先確定我們要實現(xiàn)的邏輯:
1.客戶端與H5的交互,客戶端將用戶信息(用戶名、Uid、用戶頭像等)發(fā)送給H5;
2.客戶端截取WebView功能的實現(xiàn);
3.分享功能的添加。
1.客戶端與H5交互
在界面布局中添加webView布局,對WebView布局進行初始化操作(此處需要網(wǎng)絡權(quán)限,不做單獨處理)
wv_imgweb = (WebView) findViewById(R.id.h6_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); //加載邏輯的處理 } }); //添加用戶信息參數(shù),加載H5分享地址 wv_imgweb.loadUrl(h6_url);
2.截圖功能的實現(xiàn)
上文中的WebView頁面加載完成后,即可調(diào)用截圖功能,并將圖片保存在本地指定文件夾(此處需要存儲權(quán)限,不做單獨處理)
android中WebView可以通過多種方式實現(xiàn)截圖,下面分別做不同介紹:
2.1截取屏幕內(nèi)內(nèi)容
第一種方式是通過Bitmap bitmap = webView.getDrawingCache()截取屏幕內(nèi)顯示內(nèi)容,注意調(diào)用此方法setDrawingCacheEnabled(true)必須設置為true;
2.2截取整個WebView內(nèi)容
第二種方式是通過Picture snapShot = wv_imgweb.capturePicture()來截取整個WebView的內(nèi)容
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);//設置相應的圖片質(zhì)量 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); //設置保存本地圖片質(zhì)量 bitmap.compress(Bitmap.CompressFormat.JPEG, 70, fos); fos.close(); } catch (Exception e) { UIUtils.setLogInfo("eee", e.getMessage()); } }
2.3截取整個WebView內(nèi)容
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+上會發(fā)現(xiàn),截取的快照只顯示了webview中顯示出來的那部分,沒有顯示出來的部分是空白的。通過google找到了原因,在5.0+版本上,Android對webview做了優(yōu)化,旨在減少內(nèi)存占用以提高性能。因此在默認情況下會智能的繪制html中需要繪制的部分,其實就是當前屏幕展示的html內(nèi)容,因此會出現(xiàn)未顯示的圖像是空白的。解決辦法是調(diào)用enableSlowWholeDocumentDraw()方法。這個方法需要在webview創(chuàng)建之前調(diào)用,在Activity里就是在setContentView前去調(diào)用,此方法會有顯著的性能開銷。
Android是一種基于Linux內(nèi)核的自由及開放源代碼的操作系統(tǒng),主要使用于移動設備,如智能手機和平板電腦,由美國Google公司和開放手機聯(lián)盟領(lǐng)導及開發(fā)。
看完上述內(nèi)容,你們對怎么在Android中使用WebView實現(xiàn)截圖分享功能有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。