Android截屏

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

一、Activity截屏

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

/**    * 根据指定的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界面(去除状态栏)

/**    * 根据指定的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截屏

/**  * 根据指定的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)来完成截图

/**  * 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。

/**  * ListView截图  *  * @param listView 要截图的ListView  * @return Bitmap  */ public static Bitmap shotListView(ListView listView) {   ListAdapter adapter = listView.getAdapter();   int itemsCount = adapter.getCount();   int allItemsHeight = 0;    ArrayList 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截屏

/**    * 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 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可视区域的截图

/**    * 截取webView可视区域的截图    * @param webView 前提:WebView要设置webView.setDrawingCacheEnabled(true);    * @return    */  private Bitmap captureWebViewVisibleSize(WebView webView){    Bitmap bmp = webView.getDrawingCache();    return bmp;  }  

2、截取webView的整个页面

/**   * 截取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

/**  * 截屏  *  * @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; } 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

更多相关文章

  1. Android 4.0为Launcher主界面所有应用程序图标添加统一背景主题
  2. Android基础:去掉app界面的标题-Title
  3. android 应用程序跳转到Settings的各个界面
  4. 通过程序打开Android常用系统设置界面
  5. Android编程获取网络连接状态(3G/Wifi)及调用网络配置界面

随机推荐

  1. android 自定义折线图
  2. API 25 (Android(安卓)7.1.1 API) widget
  3. Android(安卓)NDK开发(一)环境搭建及运行示
  4. android下mm模块出现编译错误问题
  5. Android(安卓)Studio 使用技巧(3)
  6. android 关闭软键盘
  7. Android中设置全屏的方法
  8. android maven lion
  9. Android危险权限和权限组
  10. 【android studio】导入项目后无法运行,修