Android 中WebView 截圖的實(shí)現(xiàn)方式
Hybrid App 中網(wǎng)頁(yè)部分的分享方式越來(lái)越趨向于多元化,比較常見的用戶操作方式有:復(fù)制網(wǎng)頁(yè)鏈接式,直接選擇目標(biāo)應(yīng)用自動(dòng)分享式等。其中,截圖行為,越來(lái)越成為豐富用戶操作、備受用戶喜愛的互動(dòng)方式之一,我們?cè)诤芏鄡?nèi)容社區(qū)類應(yīng)用中都能看到這種功能。這篇文章總結(jié)一下 Android 應(yīng)用中 WebView 截圖的實(shí)現(xiàn)方式。
WebView 作為一種特殊的控件,自然不能像其他系統(tǒng) View 或者截屏的方式來(lái)獲取截圖(多為截取長(zhǎng)圖)。如:
public static Bitmap getScreenShot(View view){
View screenView = view.getRootView();
screenView.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache());
screenView.setDrawingCacheEnabled(false);
return bitmap;
}
如果將上述代碼套在 WebView 上使用,將會(huì)得到內(nèi)容不完整的截圖。而事實(shí)上,WebView 系統(tǒng)本身提供有對(duì)應(yīng)的 API 來(lái)獲取 Bitmap 對(duì)象。
private Bitmap captureWebView(WebView webView){
Picture picture = webView.capturePicture();
int width = picture.getWidth();
int height = picture.getHeight();
if (width > 0 && height > 0) {
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
picture.draw(canvas);
return bitmap;
}
return null;
}
獲取到 Bitmap 對(duì)象后,利用這段代碼可以將其保存到設(shè)備的存儲(chǔ)卡中:
private void saveBitmap(Bitmap bitmap){
File file = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".jpg");
try {
FileOutputStream fos = new FileOutputStream(file);
bitmap.compress(CompressFormat.JPEG, 80, fos);
fos.flush();
fos.close();
} catch (java.io.IOException e) {
e.printStackTrace();
}
}
簡(jiǎn)單兩步,大功告成。然而當(dāng)你在 Android 5.0 及更高版本系統(tǒng)的設(shè)備中操作時(shí),你會(huì)發(fā)現(xiàn),截圖顯示并不完全。雖然圖片寬高符合實(shí)際要求,但是內(nèi)容只包含當(dāng)前屏幕顯示區(qū)域內(nèi) WebView 的內(nèi)容。
原因在于,為了減少內(nèi)存占用和提升性能,從 Android 5.0 開始,系統(tǒng)能夠智能化地選擇部分 Html 文檔進(jìn)行渲染。所以,默認(rèn)情況下,我們只能截取到部分屏幕顯示區(qū)域內(nèi) WebView 的內(nèi)容,也就出現(xiàn)了上述問(wèn)題。
不過(guò),系統(tǒng)也提供了對(duì)應(yīng)的 API 來(lái)修改這一默認(rèn)優(yōu)化行為。代碼很簡(jiǎn)單:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
WebView.enableSlowWholeDocumentDraw();
}
需要注意的是,這段代碼必須添加在 WebView 實(shí)例被創(chuàng)建之前。如果使用 Activity 的話,也就是在 setContentView() 方法前面。
雖然 capturePicture() 方法已經(jīng)能夠獲取 WebView 截圖,但是到 API 19 時(shí)該方法被系統(tǒng)廢棄掉了。取而代之的是使用 onDraw() 方法獲取獲取 Bitmap 對(duì)象。
private Bitmap captureWebView(WebView webView){
float scale = webView.getScale();
int width = webView.getWidth();
int height = (int) (webView.getHeight() * scale);
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
webView.draw(canvas);
return bitmap;
}
這里又要提到的是, getScale() 方法從 API 17 開始也被系統(tǒng)廢棄掉了。所以獲取 scale 值的另一種更優(yōu)雅的方式是:
webView.setWebViewClient(new WebViewClient() {
@Override
public void onScaleChanged(WebView view,float oldScale, float newScale){
super.onScaleChanged(view, oldScale, newScale);
scale = newScale;
}
});
最后一點(diǎn),在實(shí)際使用過(guò)程中,我們還需要考慮到 Bitmap 的內(nèi)存占用問(wèn)題,做好異常捕獲,防止 OOM 的出現(xiàn)。
總結(jié)
以上所述是小編給大家介紹的Android 中WebView 截圖的實(shí)現(xiàn)方式,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家的支持!
- Native.js獲取監(jiān)聽開關(guān)等操作Android藍(lán)牙設(shè)備實(shí)例代碼
- native.js獲取手機(jī)硬件基本信息實(shí)例代碼android版
- Dcloud的native.js直接撥打電話Android實(shí)例代碼
- DCloud的native.js調(diào)用系統(tǒng)分享實(shí)例Android版代碼
- Android中通過(guò)view方式獲取當(dāng)前Activity的屏幕截圖實(shí)現(xiàn)方法
- Android中如何獲取視頻文件的截圖、縮略圖
- Android模擬器中窗口截圖存成文件實(shí)現(xiàn)思路及代碼
- 詳解有關(guān)Android截圖與錄屏功能的學(xué)習(xí)
- Android實(shí)現(xiàn)截圖和分享功能的代碼
- Android獲取常用輔助方法(獲取屏幕高度、寬度、密度、通知欄高度、截圖)
- Android實(shí)現(xiàn)拍照截圖功能
- android截圖事件監(jiān)聽的原理與實(shí)現(xiàn)
- Android屏幕及view的截圖實(shí)例詳解
- Android截屏截圖的幾種方法總結(jié)
- Android實(shí)現(xiàn)截圖分享qq 微信功能
- Android實(shí)現(xiàn)從相冊(cè)截圖的功能
- Android App內(nèi)監(jiān)聽截圖加二維碼功能代碼
- Android 5.0及以上編程實(shí)現(xiàn)屏幕截圖功能的方法
- Android仿銀行客戶簽名并且保存簽名的截圖文件并命名為本地時(shí)間
- Android 截圖功能源碼的分析
- Android使用WebView實(shí)現(xiàn)截圖分享功能
- Native.js屏幕截圖實(shí)例代碼
相關(guān)文章
android開發(fā)中常用的Eclipse快捷鍵詳細(xì)整理
android開發(fā)中常用的Eclipse快捷鍵詳細(xì)整理方便查找,需要的朋友可以了解下2012-12-12
Android?studio實(shí)現(xiàn)動(dòng)態(tài)背景頁(yè)面
這篇文章主要為大家詳細(xì)介紹了Android?studio實(shí)現(xiàn)動(dòng)態(tài)背景頁(yè)面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
Android中手機(jī)錄屏并轉(zhuǎn)換GIF的兩種方式
本文主要介紹了android中手機(jī)錄屏并轉(zhuǎn)換GIF的兩種方式,具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01
Android判斷當(dāng)前棧頂Activity的包名代碼示例
這篇文章主要介紹了Android判斷當(dāng)前棧頂Activity的包名代碼示例,分享了相關(guān)代碼,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
Android中實(shí)現(xiàn)延時(shí)執(zhí)行操作的方法小結(jié)
在Android開發(fā)中我們可能會(huì)有延時(shí)執(zhí)行某個(gè)操作的需求,這篇文章主要介紹了Android中實(shí)現(xiàn)延時(shí)執(zhí)行操作的幾種方法,需要的朋友可以參考下2018-10-10
Android編程之計(jì)時(shí)器Chronometer簡(jiǎn)單示例
這篇文章主要介紹了Android計(jì)時(shí)器Chronometer簡(jiǎn)單用法,結(jié)合實(shí)例形式分析了Android計(jì)時(shí)器Chronometer的定義、事件響應(yīng)及界面布局相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
Android編程實(shí)現(xiàn)支持拖動(dòng)改變位置的圖片中疊加文字功能示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)支持拖動(dòng)改變位置的圖片中疊加文字功能,可實(shí)現(xiàn)Android圖片與文字動(dòng)態(tài)操作功能,涉及視圖及圖片動(dòng)態(tài)運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-01-01
android實(shí)現(xiàn)來(lái)電靜音示例(監(jiān)聽來(lái)電)
這篇文章主要介紹了手機(jī)來(lái)電鈴聲響起后,通過(guò)此代碼實(shí)現(xiàn)靜音而非掛斷的方法的相關(guān)資料2014-03-03
Android編程之Application設(shè)置全局變量及傳值用法實(shí)例分析
這篇文章主要介紹了Android編程之Application設(shè)置全局變量及傳值用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了全局變量及傳值的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-12-12

