WebView 網(wǎng)頁滾動截屏,可對整個網(wǎng)頁進行截屏而不是僅當前屏幕哦!
注意若Web頁面存在position:fixed; 的話得在調(diào)用前設(shè)置為 position:absolute; 哦,否則會出現(xiàn)很多次的,請看下面的具體解說吧!!
private static Bitmap
getViewBitmapWithoutBottom(View v) {
if (
null == v) {
return null;}v.setDrawingCacheEnabled(
true);v.buildDrawingCache();
if (Build.VERSION.SDK_INT >=
11) {v.measure(View.MeasureSpec.makeMeasureSpec(v.getWidth(), View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(v.getHeight(), View.MeasureSpec.EXACTLY));v.layout((
int) v.getX(), (
int) v.getY(), (
int) v.getX() + v.getMeasuredWidth(), (
int) v.getY() + v.getMeasuredHeight());}
else {v.measure(View.MeasureSpec.makeMeasureSpec(
0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(
0, View.MeasureSpec.UNSPECIFIED));v.layout(
0,
0, v.getMeasuredWidth(), v.getMeasuredHeight());}Bitmap bp = Bitmap.createBitmap(v.getDrawingCache(),
0,
0, v.getMeasuredWidth(), v.getMeasuredHeight() - v.getPaddingBottom());v.setDrawingCacheEnabled(
false);v.destroyDrawingCache();
return bp;}
public static Bitmap
getViewBitmap(View v) {
if (
null == v) {
return null;}v.setDrawingCacheEnabled(
true);v.buildDrawingCache();
if (Build.VERSION.SDK_INT >=
11) {v.measure(View.MeasureSpec.makeMeasureSpec(v.getWidth(), View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(v.getHeight(), View.MeasureSpec.EXACTLY));v.layout((
int) v.getX(), (
int) v.getY(), (
int) v.getX() + v.getMeasuredWidth(), (
int) v.getY() + v.getMeasuredHeight());}
else {v.measure(View.MeasureSpec.makeMeasureSpec(
0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(
0, View.MeasureSpec.UNSPECIFIED));v.layout(
0,
0, v.getMeasuredWidth(), v.getMeasuredHeight());}Bitmap b = Bitmap.createBitmap(v.getDrawingCache(),
0,
0, v.getMeasuredWidth(), v.getMeasuredHeight());v.setDrawingCacheEnabled(
false);v.destroyDrawingCache();
return b;}
/*** 獲取 WebView 視圖截圖* @param context* @param view* @return*/public static Bitmap
getWebViewBitmap(Context context, WebView view) {
if (
null == view)
return null;view.scrollTo(
0,
0);view.buildDrawingCache(
true);view.setDrawingCacheEnabled(
true);view.setVerticalScrollBarEnabled(
false);Bitmap b = getViewBitmapWithoutBottom(view);
int vh = view.getHeight();
int th = (
int)(view.getContentHeight()*view.getScale());Bitmap temp =
null;
if (th > vh) {
int w = getScreenWidth(context);
int absVh = vh - view.getPaddingTop() - view.getPaddingBottom();do {
int restHeight = th - vh;
if (restHeight <= absVh) {view.scrollBy(
0, restHeight);vh += restHeight;temp = getViewBitmap(view);}
else {view.scrollBy(
0, absVh);vh += absVh;temp = getViewBitmapWithoutBottom(view);}b = mergeBitmap(vh, w, temp,
0, view.getScrollY(), b,
0,
0);}
while (vh < th);}view.scrollTo(
0,
0);view.setVerticalScrollBarEnabled(
true);view.setDrawingCacheEnabled(
false);view.destroyDrawingCache();
return b;}
/*** 拼接圖片* @param newImageH* @param newImageW* @param background* @param backX* @param backY* @param foreground* @param foreX* @param foreY* @return*/private static Bitmap
mergeBitmap(
int newImageH,
int newImageW, Bitmap background,
float backX,
float backY, Bitmap foreground,
float foreX,
float foreY) {
if (
null == background ||
null == foreground) {
return null;}Bitmap bitmap = Bitmap.createBitmap(newImageW, newImageH, Bitmap.Config.RGB_565);Canvas cv =
new Canvas(bitmap);cv.drawBitmap(background, backX, backY,
null);cv.drawBitmap(foreground, foreX, foreY,
null);cv.save(Canvas.ALL_SAVE_FLAG);cv.restore();
return bitmap;}
/*** get the width of screen*/public static int getScreenWidth(Context ctx) {
int w =
0;
if (Build.VERSION.SDK_INT >
13) {Point p =
new Point();((WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getSize(p);w = p.x;}
else {w = ((WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth();}
return w;}
/*** 保存圖片* @param context* @param bitmap* @param file* @param quality* @return*/public static boolean save(Context context, Bitmap bitmap, File file,
int quality) {
if (bitmap ==
null)
return false;String abs = file.getAbsolutePath();String suffix = abs.substring(abs.lastIndexOf(
".")+
1).toLowerCase();Bitmap.CompressFormat format;
if (
"jpg".equals(suffix) ||
"jpeg".equals(suffix)) {format = Bitmap.CompressFormat.JPEG;}
else {format = Bitmap.CompressFormat.PNG;quality =
100;}
if (file.exists() && ! file.delete())
return false;
try {FileOutputStream stream =
new FileOutputStream(file);bitmap.compress(format, quality, stream);stream.flush();stream.close();context.sendBroadcast(
new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
return true;}
catch (Exception e) {
return false;}}
JS調(diào)用截屏操作
/*** 屏幕截圖* @param name* @param isRecover*/@JavascriptInterfacepublic String
Capture(String name,
boolean isRecover) {File dir =
new File(Config.PUBLIC_PICTURES_PATH);LogUtil.i(
"capture", dir.getAbsolutePath());
if (! dir.exists() && ! dir.mkdirs())
return null;
final File file =
new File(dir, name);String path = file.getAbsolutePath();
if (file.exists() && ! isRecover)
return path;body.post(
new Runnable() {
@Overridepublic void run() {Bitmap bitmap = CaptureUtil.getWebViewBitmap(activity, body);
if (
null != bitmap) ImageUtil.save(activity, bitmap, file,
100);}});
return path;}
@JavascriptInterfacepublic String
Capture(String name) {
return Capture(name,
true);}
@JavascriptInterfacepublic String
Capture() {String name = String.valueOf(System.currentTimeMillis()) +
".png";
return Capture(name);}
示例圖:我先通過 JS 觸發(fā)顯示了一個原生的 Button按鈕, 然后WebView跳轉(zhuǎn)到 csdn 頁面,然后點擊截屏按鈕用來觸發(fā)網(wǎng)頁截屏的。下面的圖是我手動截的圖,不是上面代碼的效果哈,下下面很長的那張才是Java程序的網(wǎng)頁截圖。。。
測試CSDN的網(wǎng)頁完整截圖:比較長哦~ 一般截圖的功能都用于特殊的頁面,如活動頁面之類的,不會太長,那樣是沒有問題的。若是這種滾動到底部自動加載的話可能就會很長很長很長啦·····,自己看著辦吧。。
但這里有個BUG,頂部固定Banner條每次截屏都有,這個有解決辦法,不過得是你自己的網(wǎng)頁才有操作權(quán)限哦,需要修改JS啦。
當截圖JS命令觸發(fā)前,把頂部懸浮的樣式設(shè)置為絕對定位,當截屏完成后再改回固定定位即可,沒什么難度了。
截屏是需要一些時間的,所以需要預(yù)設(shè)一個定時器來操作,JS栗子如下:
JS.Capture 是 WebView 綁定的自定義 Javascript 類對象
var file =
'';
var $header = $(
"#layout-header");$header.css({ position:
"absolute" });setTimeout(
function(){if (
typeof name ==
"function" ||
typeof name ==
"undefined") {file = JS.Capture();}
else {file = JS.Capture(name, isRecover);}},
500);setTimeout(
function(){JS.Toast(
"截圖已保存",
"fast");JS.Toast(file.replace(
"storage/emulated/0/",
""));$header.css({ position:
"fixed" });
if ($.isFunction(callback)) {callback(file);}},
1500);
轉(zhuǎn)載于:https://www.cnblogs.com/zhouzme/p/5758388.html
總結(jié)
以上是生活随笔為你收集整理的Android之WebView网页滚动截图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。