1. 程式人生 > >Android截圖截圖的幾種方法總結

Android截圖截圖的幾種方法總結

Android截圖

  Android截圖的原理:獲取具體需要截圖的區域的Bitmap,然後繪製在畫布上,儲存為圖片後進行分享或者其它用途

一、Activity截圖

1、截Activity介面(包含空白的狀態列)

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

/**

* 根據指定的Activity截圖(帶空白的狀態列)

*

* @param context 要截圖的Activity

* @return Bitmap

*/

public static Bitmap shotActivity(Activity context) {

View view = context.getWindow().getDecorView();

view.setDrawingCacheEnabled(true);

view.buildDrawingCache();

Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache(), 0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());

view.setDrawingCacheEnabled(false);

view.destroyDrawingCache();

return bitmap;

}

2、截Activity介面(去除狀態列)

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

/**

* 根據指定的Activity截圖(去除狀態列)

*

* @param activity 要截圖的Activity

* @return Bitmap

*/

public Bitmap shotActivityNoStatusBar(Activity activity) {

// 獲取windows中最頂層的view

View view = activity.getWindow().getDecorView();

view.buildDrawingCache();

// 獲取狀態列高度

Rect rect = new Rect();

view.getWindowVisibleDisplayFrame(rect);

int statusBarHeights = rect.top;

Display display = activity.getWindowManager().getDefaultDisplay();

// 獲取螢幕寬和高

int widths = display.getWidth();

int heights = display.getHeight();

// 允許當前視窗儲存快取資訊

view.setDrawingCacheEnabled(true);

// 去掉狀態列

Bitmap bmp = Bitmap.createBitmap(view.getDrawingCache(), 0,

statusBarHeights, widths, heights - statusBarHeights);

// 銷燬快取資訊

view.destroyDrawingCache();

return bmp;

}

二、View截圖

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

/**

* 根據指定的view截圖

*

* @param v 要截圖的view

* @return Bitmap

*/

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 bitmap = Bitmap.createBitmap(v.getDrawingCache(), 0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());

v.setDrawingCacheEnabled(false);

v.destroyDrawingCache();

return bitmap;

}

三、ScrollView截圖:ScrollView只有一個childView,雖然沒有全部顯示在介面上,但是已經全部渲染繪製,因此可以直接 呼叫scrollView.draw(canvas)來完成截圖

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

/**

* Scrollview截圖

*

* @param scrollView 要截圖的ScrollView

* @return Bitmap

*/

public static Bitmap shotScrollView(ScrollView scrollView) {

int h = 0;

Bitmap bitmap = null;

for (int i = 0; i < scrollView.getChildCount(); i++) {

h += scrollView.getChildAt(i).getHeight();

scrollView.getChildAt(i).setBackgroundColor(Color.parseColor("#ffffff"));

}

bitmap = Bitmap.createBitmap(scrollView.getWidth(), h, Bitmap.Config.RGB_565);

final Canvas canvas = new Canvas(bitmap);

scrollView.draw(canvas);

return bitmap;

}

四、ListView截圖:ListView是會回收與重用Item,並且只會繪製在螢幕上顯示的ItemView,下面的方法採用一個List來儲存Item的檢視,這種方案依然不夠好,當Item足夠多的時候,可能會發生oom。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

/**

* ListView截圖

*

* @param listView 要截圖的ListView

* @return Bitmap

*/

public static Bitmap shotListView(ListView listView) {

ListAdapter adapter = listView.getAdapter();

int itemsCount = adapter.getCount();

int allItemsHeight = 0;

ArrayList<Bitmap> bmps = new ArrayList<>();

for (int i = 0; i < itemsCount; i++) {

View childView = adapter.getView(i, null, listView);

childView.measure(View.MeasureSpec.makeMeasureSpec(listView.getWidth(),View.MeasureSpec.EXACTLY),

View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED));

childView.layout(0, 0, childView.getMeasuredWidth(), childView.getMeasuredHeight());

childView.setDrawingCacheEnabled(true);

childView.buildDrawingCache();

bmps.add(childView.getDrawingCache());

allItemsHeight += childView.getMeasuredHeight();

}

Bitmap bigBitmap = Bitmap.createBitmap(listView.getMeasuredWidth(), allItemsHeight, Bitmap.Config.ARGB_8888);

Canvas bigCanvas = new Canvas(bigBitmap);

Paint paint = new Paint();

int iHeight = 0;

for (int i = 0; i < bmps.size(); i++) {

Bitmap bmp = bmps.get(i);

bigCanvas.drawBitmap(bmp, 0, iHeight, paint);

iHeight += bmp.getHeight();

bmp.recycle();

bmp = null;

}

return bigBitmap;

}

五、RecycleView截圖

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

/**

* RecyclerView截圖

*

* @param view 要截圖的RecyclerView

* @return Bitmap

*/

public static Bitmap shotRecyclerView(RecyclerView view) {

RecyclerView.Adapter adapter = view.getAdapter();

Bitmap bigBitmap = null;

if (adapter != null) {

int size = adapter.getItemCount();

int height = 0;

Paint paint = new Paint();

int iHeight = 0;

final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

// Use 1/8th of the available memory for this memory cache.

final int cacheSize = maxMemory / 8;

LruCache<String, Bitmap> bitmaCache = new LruCache<>(cacheSize);

for (int i = 0; i < size; i++) {

RecyclerView.ViewHolder holder = adapter.createViewHolder(view, adapter.getItemViewType(i));

adapter.onBindViewHolder(holder, i);

holder.itemView.measure(

View.MeasureSpec.makeMeasureSpec(view.getWidth(), View.MeasureSpec.EXACTLY),

View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));

holder.itemView.layout(0, 0, holder.itemView.getMeasuredWidth(),

holder.itemView.getMeasuredHeight());

holder.itemView.setDrawingCacheEnabled(true);

holder.itemView.buildDrawingCache();

Bitmap drawingCache = holder.itemView.getDrawingCache();

if (drawingCache != null) {

bitmaCache.put(String.valueOf(i), drawingCache);

}

height += holder.itemView.getMeasuredHeight();

}

bigBitmap = Bitmap.createBitmap(view.getMeasuredWidth(), height, Bitmap.Config.ARGB_8888);

Canvas bigCanvas = new Canvas(bigBitmap);

Drawable lBackground = view.getBackground();

if (lBackground instanceof ColorDrawable) {

ColorDrawable lColorDrawable = (ColorDrawable) lBackground;

int lColor = lColorDrawable.getColor();

bigCanvas.drawColor(lColor);

}

for (int i = 0; i < size; i++) {

Bitmap bitmap = bitmaCache.get(String.valueOf(i));

bigCanvas.drawBitmap(bitmap, 0f, iHeight, paint);

iHeight += bitmap.getHeight();

bitmap.recycle();

}

}

return bigBitmap;

}

六、WebView截圖

1、擷取webView可視區域的截圖

?

1

2

3

4

5

6

7

8

9

/** 

* 擷取webView可視區域的截圖 

* @param webView 前提:WebView要設定webView.setDrawingCacheEnabled(true); 

* @return 

*/ 

private Bitmap captureWebViewVisibleSize(WebView webView){ 

Bitmap bmp = webView.getDrawingCache(); 

return bmp; 

2、擷取webView的整個頁面

?

1

2

3

4

5

6

7

8

9

10

11

12

13

/** 

* 擷取webView快照(webView載入的整個內容的大小) 

* @param webView 

* @return 

*/ 

private Bitmap captureWebView(WebView webView){ 

Picture snapShot = webView.capturePicture(); 

Bitmap bmp = Bitmap.createBitmap(snapShot.getWidth(),snapShot.getHeight(), Bitmap.Config.ARGB_8888); 

Canvas canvas = new Canvas(bmp); 

snapShot.draw(canvas); 

return bmp; 

3、擷取手機螢幕,獲取介面展示的webview

?

1

2

3

4

5

6

7

8

9

10

11

12

13

/**

* 截圖

*

* @param context

* @return

*/

private Bitmap captureScreen(Activity context) {

View cv = context.getWindow().getDecorView();

Bitmap bmp = Bitmap.createBitmap(cv.getWidth(), cv.getHeight(), Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(bmp);

cv.draw(canvas);

return bmp;

}

相關推薦

Android實現功能的方法

一般情況下各種型號的手機都會有自帶的截圖功能,也會有諸如“開關機鍵+音量鍵”的截圖快捷鍵,只要手機是亮屏狀態,都會將手機螢幕的可視區域(包含狀態列)全部擷取下來。如果開發中想要調取系統的截圖功能,理論上講是可以的,需要在APK中呼叫“adb shell screencap -

Android方法總結

Android截圖   Android截圖的原理:獲取具體需要截圖的區域的Bitmap,然後繪製在畫布上,儲存為圖片後進行分享或者其它用途 一、Activity截圖 1、截Activity介面(包含空白的狀態列) ? 1 2 3 4

android 超長顯示的方法

問題:用ImageView控制元件載入長圖的時候會遇到這樣的一個問題,同一張長圖在有些機型可以正常顯示,但是在部分機型確顯示不了。 原因:當APP開啟硬體加速的時候,GPU對於openglRender 渲染有一個限制值,超過了這個限制值,就無法渲染,不同的手機會有不同的限制值; j針對這

Android去掉標題欄的方法

1、直接在重寫的onCreate方法中說明 注意: this.requestWindowFeature(Window.FEATURE_NO_TITLE); 需要在setContentView(R.layout.activity_main);這一句上面。 2、在Andro

html5 如何打包成apk,將H5封裝成android應用APK檔案的方法

直接使用程式設計軟體提供的方法: 1、需要下載安裝MyEclipse2014,Android SDK,eclipse(需配置Android開發環境) Java和Android環境安裝與配置。 2、開啟MyEclipse2014,新建一個HTML5 Mobile Ap

Android下獲取FPS的方法

sunrain_hjb的BLOG ARM.WinCE.Android.Robot.Linux.IoT.VR... Develop Helpful and Effective apps to make Jobs easier and lives Better!

Android非同步更新UI的方法

前言  我們知道在android開發中不能在非ui執行緒中更新ui,但是,有的時候我們需要在程式碼中執行一些諸如訪問網路、查詢資料庫等耗時操作,為了不阻塞ui執行緒,我們時常會開啟一個新的執行緒(工作執行緒)來執行這些耗時操作,然後我們可能需要將查詢到的資料渲

記錄Android中實現滑動的方法

一、layou方法 程式碼示例如下,自定義一個view,在onTouchEvent()方法中計算手指滑動時的偏移量,呼叫view的layout()方法,在當前left、top、right、bottom上加上偏移量,實現view的滑動。 public clas

Android Studio匯入專案的方法

Android Studio,最近也在試著使用它,原因是多方面的,一個畢竟是未來的趨勢,二則是github上越來越多的大牛開源專案都是基於Android Studio的,因此會使用Android Studio就成為一件必須的任務。 本文主要說一下如何在Android Studio中匯入已有的專案進去

學習筆記:Android裡JSON解析的方法

一、解析方法:  Android解析json有很多種方法,下面介紹三種方法:Android自帶的org.json解析、Gson解析和Jackson解析。 優缺點對比:  Android自帶的方法有點像xml的dom解析,遍歷之後根據需要的key值去取資

JS刷新當前頁面的方法總結

onu navigate mman reload 存在 .exe time 通過 復制代碼 reload 方法,該方法強迫瀏覽器刷新當前頁面。語法:location.reload([bForceGet])

laravel安裝的方法總結

php laravel 安裝 Laravel安裝方法大的來分可以分為利用Composer安裝和一鍵安裝包安裝。先來說一下最簡單的安裝方式,利用一鍵安裝包來安裝Laravel。為了方便初學者學習Laravel有大神在網上提供了一鍵安裝包(下載網址:http://www.golaravel.com/d

優化MySQL性能的方法-總結

big 計算 保持 失敗 優化mysql sql one div 另一個 原文:http://bbs.landingbj.com/t-0-245601-1.html 1、要選取最適用的字段屬性 MySQL可以很好的支持大數據量的存取,但是一般說來,數據庫中的表越

生成下拉框的方法總結——數據來源:枚舉

ati state 數據集 equal type() tty each 其中 sele 上節介紹數據來源是數據庫,這節介紹對枚舉進行數據獲取,形成下拉列表。 使用場景:某些狀態值獲取等,一般是數據量小,不需要在數據庫中進行維護的數據集 1、前提要有枚舉數據

js 刪除陣列中某一項的方法總結

第一種:改變原陣列 借用原生陣列方法:splice(index,len,[item])  剪接 借用原生物件方法:delete array[index] + array.slice(0, index).concat(array.slice(index, array.length-1))

防止表單重複提交的方法總結

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/Warpar/article/details/72917924 1、JavaScript防止表單重複提交(主要用於網路延遲情況下使用者點選多次submit按鈕導致表單重複提

C++中函式返回陣列指標的方法總結

因為陣列不能被拷貝,所以函式不能返回陣列。不過,函式可以返回陣列的指標或引用。返回陣列指標的方法有以下幾種:     1、方法一:使用類型別名。如下         typedef int arrt[10];//arrT是一個類型別名,它表示的型別是含有10個整數的陣列   

資料庫sql優化的方法總結

在sql查詢中為了提高查詢效率,我們常常會採取一些措施對查詢語句進行sql優化,下面總結的一些方法,有需要的可以參考參考。 1.對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。 2.應儘量避免在 wher

[組合數]求組合數的方法總結

求C(n,m)%mod的方法總結 1.當n,m都很小的時候可以利用楊輝三角直接求。 C(n,m)=C(n-1,m)+C(n-1,m-1); 2.利用乘法逆元。 乘法逆元:(a/b)%mod=a*(b^(mod-2)) mod為素數。 逆元可以利用擴

微信小程式 傳值取值的方法總結,百分百會用到

微信小程式 傳值取值 小程式裡常見的取值有以下幾種,一個完整的專案寫下來,用到的概率幾乎是100%。 列表index下標取值 頁面傳值 form表單取值 列表index下標取值 實現方式是:data-index=”{{index}}”挖坑及e.cu