1. 程式人生 > >Android給scrollView截圖超過螢幕大小形成長圖

Android給scrollView截圖超過螢幕大小形成長圖

很多的時候,我們想要分享一個介面的所有內容,可是內容太多,超過了螢幕的大小,簡單的截圖已經滿足不了我們的需要,這時候我們就可以根據佈局裡scrollView的高度來擷取圖片。

程式碼如下:

/**
	 * 擷取scrollview的螢幕
	 * @param scrollView
	 * @return
	 */
	public static Bitmap getBitmapByView(ScrollView scrollView) {
		int h = 0;
		Bitmap bitmap = null;
		// 獲取scrollview實際高度
		for (int i = 0; i < scrollView.getChildCount(); i++) {
			h += scrollView.getChildAt(i).getHeight();
			scrollView.getChildAt(i).setBackgroundColor(
					Color.parseColor("#ffffff"));
		}
		// 建立對應大小的bitmap
		bitmap = Bitmap.createBitmap(scrollView.getWidth(), h,
				Bitmap.Config.RGB_565);
		final Canvas canvas = new Canvas(bitmap);
		scrollView.draw(canvas);
		return bitmap;
	}

	/**
	 * 壓縮圖片
	 * @param image
	 * @return
	 */
	public static Bitmap compressImage(Bitmap image) {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		// 質量壓縮方法,這裡100表示不壓縮,把壓縮後的資料存放到baos中
		image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
		int options = 100;
		// 迴圈判斷如果壓縮後圖片是否大於100kb,大於繼續壓縮
		while (baos.toByteArray().length / 1024 > 100) {
			// 重置baos
			baos.reset();
			// 這裡壓縮options%,把壓縮後的資料存放到baos中
			image.compress(Bitmap.CompressFormat.JPEG, options, baos);
			// 每次都減少10
			options -= 10;
		}
		// 把壓縮後的資料baos存放到ByteArrayInputStream中
		ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
		// 把ByteArrayInputStream資料生成圖片
		Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);
		return bitmap;
	}

/**
	 * 儲存到sdcard
	 * @param b
	 * @return
	 */
	public static String savePic(Bitmap b) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss",
				Locale.US);
		File outfile = new File("/sdcard/image");
		// 如果檔案不存在,則建立一個新檔案
		if (!outfile.isDirectory()) {
			try {
				outfile.mkdir();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		String fname = outfile + "/" + sdf.format(new Date()) + ".png";
		FileOutputStream fos = null;
		try {
			fos = new FileOutputStream(fname);
			if (null != fos) {
				b.compress(Bitmap.CompressFormat.PNG, 90, fos);
				fos.flush();
				fos.close();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return fname;
	}
在需要用到的地方呼叫getBitmapByView()方法即可:
String fname = ScreenShot.savePic(ScreenShot.getBitmapByView(scrollView));

但是這樣寫的話有時候會因為擷取的圖片太長太大而報outofmemory的錯,所以為了避免記憶體溢位,程式崩掉,要注意用Config.RGB_565,會比ARGB_8888少佔記憶體。還有就是把圖片壓縮一下,至少我這樣就沒有報oom的錯了,即:
String fname = ScreenShot.savePic(ScreenShot.compressImage(ScreenShot
						.getBitmapByView(scrollView)));

相關推薦

AndroidscrollView超過螢幕大小成長

很多的時候,我們想要分享一個介面的所有內容,可是內容太多,超過了螢幕的大小,簡單的截圖已經滿足不了我們的需要,這時候我們就可以根據佈局裡scrollView的高度來擷取圖片。 程式碼如下: /** * 擷取scrollview的螢幕 * @param scrollV

基於android 實現擷取 內容超過螢幕大小的長

任何事都要去試試,只停留在想象的層面,那也等於waste of time,不要想當然 先看需求: 當內容已經超出了手機可顯示的範圍時,要擷取這些所有的內容,從而生成所謂的”長截圖”. 沒什麼難點,利用了webview的特點,和scrollview 的vie

自定義MarqueeTextView字型沒有超過螢幕大小也能實現跑馬燈效果.

第一篇文章小白一名直接上程式碼吧 第一步:這個是自定義跑馬燈的類 public class MarqueeTextView extends android.support.v7.widget.AppCompatTextView { /** * 是否停止滾動 */ private boolea

Android中當item數量超過一定大小RecyclerView高度固定

Android中當item數量超過一定大小時,將RecyclerView高度固定 方法1 直接通過LayoutParams來設定相應高度 ViewGroup.LayoutParams lp = rv.getLayoutParams(); if

教你怎麼圖片等比例放大縮小超過螢幕大小

我就是那個帖子的樓主並且是版主,希望以後和大家多交流,我是南京誠邁公司的,叫廖建國,在ES2部分。 之前看到好多人問一個問題:怎麼圖片等比例放大或縮小超過螢幕大小,主要是後面超過螢幕大小,我一直沒看到有人回答,這個功能比較常見,所以我把這個方法共享出來,只是寫了核心

如何在一臺Android裝置上模擬不同的螢幕大小和解析度

在4.3之後,Android引入了wm shell命令,使用這條命令在一臺裝置上模擬出不同的螢幕解析度和畫素密度。這將方便開發者除錯APP在不同的裝置螢幕上的顯示效果。 adb shell wm size [reset | WxH]  設定新的螢幕寬W和寬H,執行rese

android webview載入html圖片自適應手機螢幕大小&點選檢視大

我們在開發中,顯示資訊詳情時,一般後臺會給出html文字,在Android端一般採用webview控制元件來展示,但是後臺給出的html文字一般是給電腦端用的,沒有自適配手機,導致手機端圖片顯示過大,需要左右移動來檢視全圖。下面給出幾種實用方法,達到在手機端用webvi

Android 開發技巧之 禁止螢幕常亮

1 禁止截圖         出於安全考慮,我們需要對某些介面,比如二維碼介面,登入介面禁止截圖。(像支付寶的付款二維碼)   禁止截圖的程式碼很簡單就一行,在Activity 生命初期的onCre

Android ScrollView巢狀ScrollView,並且巢狀的ScrollView超過螢幕部分

問題:我在ScrollView裡面嵌套了一個ScrollView,巢狀的ScrollView超出了螢幕顯示部分,需要向下滑動才能看到,當滑動下去找到巢狀的ScrollView時,滑動時並不能觸發它的onTouch()事件。 解決思路: 1. 先是參考的h

Android提高應用的安全性, 禁止螢幕

在玩交通銀行的客戶端的時候, 發現一個很人性化的功能: 禁止螢幕截圖. 於是決定看看這個功能是怎麼實現的. Google了一番, 發現實現的方式就是在setContentView()方法前加上: getWindow().setFlags(LayoutPara

通過Python連線手機,並手機螢幕儲存到電腦(android

首先下載adb可以到百度網盤連結下載:https://pan.baidu.com/s/1htbYtq0或者自己去搜索引擎搜尋,網上一大堆將下載的壓縮包解壓,如圖:然後再系統中新增環境變數:右鍵我的電腦- 屬性-高階系統設定-高階-環境變數將Path中新增adb.exe的路徑:

Android零基礎入門第61節:滾動視ScrollView

andro 淡出 幀布局 選擇器 公眾號 響應 ges 分享 當前 前面幾期學習了ProgressBar系列組件、ViewAnimator系列組件、Picker系列組件和時間日期系列組件,接下來幾期繼續來學習常見的其他組件。 一、ScrollView概述

Android之高效率

了解 過去 自動化測試工具 簡單 tac 4.5 height www 能夠 本文來自網易雲社區作者:孫聖翔在一張Android手機上截圖有好多辦法,為了能夠高效率的截圖,我幾乎把所有的方法都嘗試了一般。走了好多路,也遇到了好多的問題。只是想記錄下這其中的不容易。下面所有的

CSS實現自適應不同大小螢幕的背景大的兩種方法(轉自簡書)

CSS實現自適應不同大小螢幕的背景大圖的兩種方法 一張清晰漂亮的背景圖片能給網頁加分不少,設計師也經常會給頁面的背景使用大圖,我們既不想圖片因為不同解析度圖片變形,也不希望當在大屏的情況下,背景有一塊露白,簡而言之,就是實現能自適應螢幕大小又不會變形的背景大圖,而且背景圖片不會隨著

Android之獲取螢幕大小

java 程式碼 import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.DisplayMetrics; import andr

Android 輸出一個字串,不管字型大小如何修改,始終螢幕水平居中

本文指在沒有使用控制元件的的情況下 //獲取到螢幕的寬度 WindowManager wm = (WindowManager) getContext() .getSystemService(Conte

Android手機各種方法

/** * 螢幕相關的輔助類 * * @since 2015-05-27 * @author lixi */ public class ScreenUtils { private ScreenUtils() { throw new UnsupportedOper

Android 任意區域

1、全屏截圖 Android其實可以做到任意區域截圖,不過我們先來看看整個螢幕截圖程式碼,相信大家很熟悉,程式碼如下 View decorView = activity.getWindow().getDecorView(); decorView.setD

VC螢幕(將螢幕指定區域存成圖片)

HBITMAP CLoadpicDlg::CopyScreenToBitmap(LPRECT lpRect) {  HDC hScrDC, hMemDC;   // 螢幕和記憶體裝置描述表   HBITMAP hBitmap,hOldBitmap;   // 點陣圖控

Android根據螢幕大小動態適配GridView

       最近有個需求上面有圖片,下面是個類似九宮格的列表,列表下面還有文字,剛開始只有3列還可以佈滿,後面改了需求有4列,在小屏手機就沒有鋪滿,第4列看不到了,修改圖片和文字長寬也沒適配,後面想到利用layoutparams動態適配,