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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值