Android截屏截图方法汇总(Activity、View、ScrollView、ListView、RecycleView、WebView截屏截图)

来源:互联网 发布:ppap 知乎 编辑:程序博客网 时间:2024/05/17 14:14

 转自:http://blog.csdn.net/billy_zuo/article/details/71077681

Android截屏

  Android截屏的原理:获取具体需要截屏的区域的Bitmap,然后绘制在画布上,保存为图片后进行分享或者其它用途

一、Activity截屏

1、截Activity界面(包含空白的状态栏)

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /** 
  2.      * 根据指定的Activity截图(带空白的状态栏) 
  3.      * 
  4.      * @param context 要截图的Activity 
  5.      * @return Bitmap 
  6.      */  
  7.     public static Bitmap shotActivity(Activity context) {  
  8.         View view = context.getWindow().getDecorView();  
  9.         view.setDrawingCacheEnabled(true);  
  10.         view.buildDrawingCache();  
  11.   
  12.         Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache(), 00, view.getMeasuredWidth(), view.getMeasuredHeight());  
  13.         view.setDrawingCacheEnabled(false);  
  14.         view.destroyDrawingCache();  
  15.         return bitmap;  
  16.     }  


2、截Activity界面(去除状态栏)

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /** 
  2.      * 根据指定的Activity截图(去除状态栏) 
  3.      * 
  4.      * @param activity 要截图的Activity 
  5.      * @return Bitmap 
  6.      */  
  7.     public Bitmap shotActivityNoStatusBar(Activity activity) {  
  8.         // 获取windows中最顶层的view  
  9.         View view = activity.getWindow().getDecorView();  
  10.         view.buildDrawingCache();  
  11.   
  12.         // 获取状态栏高度  
  13.         Rect rect = new Rect();  
  14.         view.getWindowVisibleDisplayFrame(rect);  
  15.         int statusBarHeights = rect.top;  
  16.         Display display = activity.getWindowManager().getDefaultDisplay();  
  17.   
  18.         // 获取屏幕宽和高  
  19.         int widths = display.getWidth();  
  20.         int heights = display.getHeight();  
  21.   
  22.         // 允许当前窗口保存缓存信息  
  23.         view.setDrawingCacheEnabled(true);  
  24.   
  25.         // 去掉状态栏  
  26.         Bitmap bmp = Bitmap.createBitmap(view.getDrawingCache(), 0,  
  27.                 statusBarHeights, widths, heights - statusBarHeights);  
  28.   
  29.         // 销毁缓存信息  
  30.         view.destroyDrawingCache();  
  31.   
  32.         return bmp;  
  33.     }  


二、View截屏

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  * 根据指定的view截图 
  3.  * 
  4.  * @param v 要截图的view 
  5.  * @return Bitmap 
  6.  */  
  7. public static Bitmap getViewBitmap(View v) {  
  8.     if (null == v) {  
  9.         return null;  
  10.     }  
  11.     v.setDrawingCacheEnabled(true);  
  12.     v.buildDrawingCache();  
  13.     if (Build.VERSION.SDK_INT >= 11) {  
  14.         v.measure(View.MeasureSpec.makeMeasureSpec(v.getWidth(), View.MeasureSpec.EXACTLY),  
  15.                 View.MeasureSpec.makeMeasureSpec(v.getHeight(), View.MeasureSpec.EXACTLY));  
  16.         v.layout((int) v.getX(), (int) v.getY(), (int) v.getX() + v.getMeasuredWidth(), (int) v.getY() + v.getMeasuredHeight());  
  17.     } else {  
  18.         v.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),  
  19.                 View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));  
  20.         v.layout(00, v.getMeasuredWidth(), v.getMeasuredHeight());  
  21.     }  
  22.   
  23.     Bitmap bitmap = Bitmap.createBitmap(v.getDrawingCache(), 00, v.getMeasuredWidth(), v.getMeasuredHeight());  
  24.     v.setDrawingCacheEnabled(false);  
  25.     v.destroyDrawingCache();  
  26.     return bitmap;  
  27. }  


三、ScrollView截屏:ScrollView只有一个childView,虽然没有全部显示在界面上,但是已经全部渲染绘制,因此可以直接 调用scrollView.draw(canvas)来完成截图

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  * Scrollview截屏 
  3.  * 
  4.  * @param scrollView 要截图的ScrollView 
  5.  * @return Bitmap 
  6.  */  
  7. public static Bitmap shotScrollView(ScrollView scrollView) {  
  8.     int h = 0;  
  9.     Bitmap bitmap = null;  
  10.     for (int i = 0; i < scrollView.getChildCount(); i++) {  
  11.         h += scrollView.getChildAt(i).getHeight();  
  12.         scrollView.getChildAt(i).setBackgroundColor(Color.parseColor("#ffffff"));  
  13.     }  
  14.     bitmap = Bitmap.createBitmap(scrollView.getWidth(), h, Bitmap.Config.RGB_565);  
  15.     final Canvas canvas = new Canvas(bitmap);  
  16.     scrollView.draw(canvas);  
  17.     return bitmap;  
  18. }  


四、ListView截屏:ListView是会回收与重用Item,并且只会绘制在屏幕上显示的ItemView,下面的方法采用一个List来存储Item的视图,这种方案依然不够好,当Item足够多的时候,可能会发生oom。

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  * ListView截图 
  3.  * 
  4.  * @param listView 要截图的ListView 
  5.  * @return Bitmap 
  6.  */  
  7. public static Bitmap shotListView(ListView listView) {  
  8.     ListAdapter adapter = listView.getAdapter();  
  9.     int itemsCount = adapter.getCount();  
  10.     int allItemsHeight = 0;  
  11.   
  12.     ArrayList<Bitmap> bmps = new ArrayList<>();  
  13.     for (int i = 0; i < itemsCount; i++) {  
  14.         View childView = adapter.getView(i, null, listView);  
  15.         childView.measure(View.MeasureSpec.makeMeasureSpec(listView.getWidth(),View.MeasureSpec.EXACTLY),  
  16.                 View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED));  
  17.   
  18.         childView.layout(00, childView.getMeasuredWidth(), childView.getMeasuredHeight());  
  19.         childView.setDrawingCacheEnabled(true);  
  20.         childView.buildDrawingCache();  
  21.         bmps.add(childView.getDrawingCache());  
  22.         allItemsHeight += childView.getMeasuredHeight();  
  23.     }  
  24.   
  25.     Bitmap bigBitmap = Bitmap.createBitmap(listView.getMeasuredWidth(), allItemsHeight, Bitmap.Config.ARGB_8888);  
  26.     Canvas bigCanvas = new Canvas(bigBitmap);  
  27.   
  28.     Paint paint = new Paint();  
  29.     int iHeight = 0;  
  30.   
  31.     for (int i = 0; i < bmps.size(); i++) {  
  32.         Bitmap bmp = bmps.get(i);  
  33.         bigCanvas.drawBitmap(bmp, 0, iHeight, paint);  
  34.         iHeight += bmp.getHeight();  
  35.   
  36.         bmp.recycle();  
  37.         bmp = null;  
  38.     }  
  39.     return bigBitmap;  
  40. }  


五、RecycleView截屏

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /** 
  2.      * RecyclerView截屏 
  3.      * 
  4.      * @param view 要截图的RecyclerView 
  5.      * @return Bitmap 
  6.      */  
  7.     public static Bitmap shotRecyclerView(RecyclerView view) {  
  8.         RecyclerView.Adapter adapter = view.getAdapter();  
  9.         Bitmap bigBitmap = null;  
  10.         if (adapter != null) {  
  11.             int size = adapter.getItemCount();  
  12.             int height = 0;  
  13.             Paint paint = new Paint();  
  14.             int iHeight = 0;  
  15.             final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);  
  16.   
  17.             // Use 1/8th of the available memory for this memory cache.  
  18.             final int cacheSize = maxMemory / 8;  
  19.             LruCache<String, Bitmap> bitmaCache = new LruCache<>(cacheSize);  
  20.             for (int i = 0; i < size; i++) {  
  21.                 RecyclerView.ViewHolder holder = adapter.createViewHolder(view, adapter.getItemViewType(i));  
  22.                 adapter.onBindViewHolder(holder, i);  
  23.                 holder.itemView.measure(  
  24.                         View.MeasureSpec.makeMeasureSpec(view.getWidth(), View.MeasureSpec.EXACTLY),  
  25.                         View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));  
  26.                 holder.itemView.layout(00, holder.itemView.getMeasuredWidth(),  
  27.                         holder.itemView.getMeasuredHeight());  
  28.                 holder.itemView.setDrawingCacheEnabled(true);  
  29.                 holder.itemView.buildDrawingCache();  
  30.                 Bitmap drawingCache = holder.itemView.getDrawingCache();  
  31.                 if (drawingCache != null) {  
  32.   
  33.                     bitmaCache.put(String.valueOf(i), drawingCache);  
  34.                 }  
  35.                 height += holder.itemView.getMeasuredHeight();  
  36.             }  
  37.   
  38.             bigBitmap = Bitmap.createBitmap(view.getMeasuredWidth(), height, Bitmap.Config.ARGB_8888);  
  39.             Canvas bigCanvas = new Canvas(bigBitmap);  
  40.             Drawable lBackground = view.getBackground();  
  41.             if (lBackground instanceof ColorDrawable) {  
  42.                 ColorDrawable lColorDrawable = (ColorDrawable) lBackground;  
  43.                 int lColor = lColorDrawable.getColor();  
  44.                 bigCanvas.drawColor(lColor);  
  45.             }  
  46.   
  47.             for (int i = 0; i < size; i++) {  
  48.                 Bitmap bitmap = bitmaCache.get(String.valueOf(i));  
  49.                 bigCanvas.drawBitmap(bitmap, 0f, iHeight, paint);  
  50.                 iHeight += bitmap.getHeight();  
  51.                 bitmap.recycle();  
  52.             }  
  53.         }  
  54.         return bigBitmap;  
  55.     }  


六、WebView截屏

1、截取webView可视区域的截图

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1.  /**   
  2.     * 截取webView可视区域的截图   
  3.     * @param webView 前提:WebView要设置webView.setDrawingCacheEnabled(true);   
  4.     * @return   
  5.     */    
  6. private Bitmap captureWebViewVisibleSize(WebView webView){    
  7.     Bitmap bmp = webView.getDrawingCache();    
  8.     return bmp;    
  9. }    


2、

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /**   
  2.  * 截取webView快照(webView加载的整个内容的大小)   
  3.  * @param webView   
  4.  * @return   
  5.  */    
  6. private Bitmap captureWebView(WebView webView){    
  7.     Picture snapShot = webView.capturePicture();    
  8.         
  9.     Bitmap bmp = Bitmap.createBitmap(snapShot.getWidth(),snapShot.getHeight(), Bitmap.Config.ARGB_8888);    
  10.     Canvas canvas = new Canvas(bmp);    
  11.     snapShot.draw(canvas);    
  12.     return bmp;    
  13. }    


3、截取

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  * 截屏 
  3.  * 
  4.  * @param context 
  5.  * @return 
  6.  */  
  7. private Bitmap captureScreen(Activity context) {  
  8.     View cv = context.getWindow().getDecorView();  
  9.     Bitmap bmp = Bitmap.createBitmap(cv.getWidth(), cv.getHeight(), Bitmap.Config.ARGB_8888);  
  10.     Canvas canvas = new Canvas(bmp);  
  11.     cv.draw(canvas);  
  12.     return bmp;  
  13. }  
0 0