Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android 屏幕截圖時,如何更改截圖內容,將兩個bitmap合並一起顯示圖像

android 屏幕截圖時,如何更改截圖內容,將兩個bitmap合並一起顯示圖像

編輯:關於Android編程

項目中遇到的需求,需要截圖,截圖方法如下

此方法傳入一個想要截圖的activity

	/**
	 * 截圖 對相應的activity截圖
	 * 
	 * @param activity
	 * @return
	 */
	public Bitmap takeScreenShot(Activity activity) {
		View rootView = activity.getWindow().getDecorView();
		rootView.setDrawingCacheEnabled(true);
		rootView.buildDrawingCache();
		Bitmap bitmap = rootView.getDrawingCache();
		// 獲取狀態欄高度
		Rect frame = new Rect();
		activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
		int statusBarHeight = frame.top;
		// Log.i("TAG", "" + statusBarHeight);
		// 獲取屏幕長和高

		int width = activity.getWindowManager().getDefaultDisplay().getWidth();
		int height = activity.getWindowManager().getDefaultDisplay()
				.getHeight();

		// 去掉標題欄

		Bitmap b = Bitmap.createBitmap(bitmap, 0, statusBarHeight, width,
				height - statusBarHeight - height / 3 + 100);
		
		rootView.setDrawingCacheEnabled(false);

		
		return b;
	}

但是發現截取的圖像有些內容是需要我修改的,比如想要把截圖中的標題替換成另一個樣子,原來的activity還不能修改的情況下,只能重新做一個bitmap,並將此bitmap添加到上面返回的bitmap的相應位置中;如下是添加的方法:

		// 這是我從資源文件中定義的長度,也可自由設置
		float dimension = getResources().getDimension(
				R.dimen.activity_action_bar_height);
		
		//conView為自己想要加入的View 是我之前自己寫的View用來生成替換的bitmap
		conView.setDrawingCacheEnabled(true);
		conView.buildDrawingCache();
		
		Bitmap bitmap3 = conView.getDrawingCache();//這個方法需要注意,往下會說
		Bitmap bitmap2 = Bitmap.createBitmap(bitmap3, 0, statusBarHeight,
		width, (int) dimension);
int w = bitmap2.getWidth();int h = bitmap2.getHeight();int[] pixels = new int[w * h];bitmap2.getPixels(pixels, 0, w, 0, 0, w, h);

		
		
		Bitmap b = Bitmap.createBitmap(bitmap, 0, statusBarHeight, width,
				height - statusBarHeight - height / 3 + 100);
		//
		//將生成的bitmap替換原來bitmap中的位置
		b.setPixels(pixels, 0, w, width / 5, 0, w, h);


運行結果發現報錯,自己定義的View生成的bitmap為空,也就是Bitmap bitmap3 = conView.getDrawingCache();返回空,原來是計算conView的bitmap超出了系統內存限制的大小,主要原因是drawingCache的值大於系統給定的值。我們可以看一下buildDrawingCache()方法中的一段代碼:

if (width <= 0 || height <= 0 ||(width * height * (opaque && !translucentWindow ? 2 : 4) > ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize())) {   
                 destroyDrawingCache();   
                 return;   
  } 
上面的代碼中,width和height是所要cache的view繪制的寬度和高度,所以(width * height * (opaque && !translucentWindow ? 2 : 4) 計算的是當前所需要的cache大小。ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize()得到的是系統所提供的最大的DrawingCache的值。當所需要的drawingCache >系統所提供的最大DrawingCache值時,生成Bitmap就會出現問題,此時獲取的Bitmap就為null。        所以在只需要修改所需的cache值就可以解決問題了。於是我們引入第二種方法:

public static Bitmap convertViewToBitmap(View view){
   view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
view.buildDrawingCache();
Bitmap bitmap = view.getDrawingCache();


     return bitmap;
}



這樣用此方法替換之前用View 生成bitmap的方法即可


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