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打开系统联系人界面
  2. 在Android中实现service动态更新UI界面
  3. Android中应用界面主题Theme使用方法和页面定时跳转应用
  4. Android泡泡聊天界面的实现
  5. android:使android界面打开时EditText不自动获得焦点
  6. 【Android】20.0 第20章 音频、视频、拍照、截图
  7. Android透明界面与ListView动态刷新
  8. Android studio登录界面之记住密码
  9. Android开机界面

随机推荐

  1. android AVD 4.0 下解决中文输入问题
  2. Android(安卓)service与Thread
  3. Andriod学习笔记(二)
  4. Android(安卓)实用技巧 --- 命令godir
  5. ANDROID自动化测试工具:ROBOTIUM
  6. Android(安卓)第三方开源SwipeToDismiss:
  7. Android(安卓)Studio自动生成带系统签名
  8. Android(安卓)Camera 使用小结
  9. Android(安卓)事件传递机制
  10. Android插件技术——(一)动态加载jar