Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android給scrollView截圖超過屏幕大小形成長圖

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

編輯:關於Android編程

很多的時候,我們想要分享一個界面的所有內容,可是內容太多,超過了屏幕的大小,簡單的截屏已經滿足不了我們的需要,這時候我們就可以根據布局裡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)));


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved