編輯:關於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的方法即可
在Android項目中我們經常會遇到如下的UI展示需求就是模塊標題的顯示,通常後面內容是動態的,還有諸如有無向右箭頭,上下是否顯示線條等不同需求.之前項目中的做法是用一個
0x00閱讀本文前,建議讀者首先閱讀Android加殼原理,參考文章Android中的Apk的加固(加殼)原理解析和實現。如果沒有看過這篇文章,本文理解起來比較困難。0x
1.ListView和Adapter1)ListView就是一個能數據集合以動態滾動的方式展示到用戶界面上的View,即:以列表的形式展示具體內容,並且能夠根據數據的長度
掌握什麼是View? View 坐標的基本概念 View的生命周期 如何自定義View什麼是View?android.app.View 就是手機的UI,View 負責繪制