关闭

【Android】获取View的截图

标签: android截图
2601人阅读 评论(2) 收藏 举报
分类:

在Android应用开发过程中,可能会遇到需要对整个界面或者某一部分进行截图的需求。

Android中对View的截图也有以下两种方式,值得注意的是两个方法都不适用于SurfaceView


1、使用DrawingCache

如果使用DrawingCache,则对要截图的View有一个要求:View本身已经显示在界面上。如果View没有添加到界面上或者没有显示(绘制)过,则buildDrawingCache会失败。这种方式比较适合对应用界面或者某一部分的截图。步骤很简单:

view.setDrawingCacheEnabled(true);  
view.buildDrawingCache();       //启用DrawingCache并创建位图  

//创建一个DrawingCache的拷贝,因为DrawingCache得到的位图在禁用后会被回收  
Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache()); 
view.setDrawingCacheEnabled(false);     //禁用DrawingCahce否则会影响性能  

完整的截图功能函数如下:

 /**
   * 获取一个 View 的缓存视图
   *
   * @param view
   * @return
   */
  private Bitmap getCacheBitmapFromView(View view) {
      final boolean drawingCacheEnabled = true;
      view.setDrawingCacheEnabled(drawingCacheEnabled);
      view.buildDrawingCache(drawingCacheEnabled);
      final Bitmap drawingCache = view.getDrawingCache();
      Bitmap bitmap;
      if (drawingCache != null) {
          bitmap = Bitmap.createBitmap(drawingCache);
          view.setDrawingCacheEnabled(false);
      } else {
          bitmap = null;
      }
      return bitmap;
  }


2、直接调用View.draw

如果需要截图的View并没有添加到界面上,可能是通过java代码创建的或者inflate创建的,此时调用DrawingCache方法是获取不到位图的。因为View在添加到容器中之前并没有得到实际的大小(如果LayoutWidth是MatchParent,它还没有Parent…),所以首先需要指定View的大小:

private void layoutView(View v, int width, int height) {  
    // validate view.width and view.height  
    v.layout(0, 0, width, height);  
    int measuredWidth = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY);  
    int measuredHeight = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY);  

    // validate view.measurewidth and view.measureheight  
    v.measure(measuredWidth, measuredHeight);  
    v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());i  
}  

使用方式如下:

int viewWidth = webView.getMeasuredWidth();  
int viewHeight = webView.getMeasuredHeight();  
if (viewWidth > 0 && viewHeight > 0) {  
    b = Bitmap.createBitmap(viewWidth, viewHeight, Config.ARGB_8888);  
    Canvas cvs = new Canvas(b);  
    webView.draw(cvs);  
}  

对于WebView的截图有一点特殊,网页内容并不能在布局完成后立即渲染出来,大概需要300ms的时间(对于不同性能的设备、网页复杂程度和Webkit版本可能不同)。

如果创建后台的WebView需要截图的话,应该在创建时就对其进行布局操作,这样加载完成后大部分就已经渲染完毕了(除非有异步的js处理)。


【参考资料】:

1、Android应用截图两种方法
2、知乎和简书的夜间模式实现套路

2
1
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

【Android】获取View的截图

有时候在开发过程中可能需要通过获得View的副本来做一些处理,为了得到副本,一种方法是用另一个布局完全一样的View来拷贝目标内容,另外一种方法是直接获得这个View的截图。很显然获得截图的方式更便捷...
  • ydzyd
  • ydzyd
  • 2015-11-19 17:44
  • 5386

android对View控件截图并保存

/** 保存View为图片的方法 */ public void saveBitmap(View v, String name) { String fileName = name + ".p...
  • cxq234843654
  • cxq234843654
  • 2014-12-16 15:18
  • 2048

Android 任意区域截屏

1、全屏截图Android其实可以做到任意区域截屏,不过我们先来看看整个屏幕截图代码,相信大家很熟悉,代码如下View decorView = activity.getWindow().getDeco...
  • dbs1215
  • dbs1215
  • 2017-03-03 22:47
  • 1455

Android应用截图两种方法

在Android应用开发过程中,可能会遇到需要对整个界面或者某一部分进行截图的需求。Android中对View的截图也有很多中方式: 使用DrawingCache直接调用View.draw Dra...
  • jokers_i
  • jokers_i
  • 2014-09-25 13:59
  • 17135

Android获取View的截图,包括各种Layout的截图

Layout生效后才能使用 /** * 获取Layout截图 * * @return 所需区域的截图 */ private Bitmap getBit...
  • qq_18833399
  • qq_18833399
  • 2016-05-13 10:17
  • 1361

实现屏幕截图的代码-Android

转自:http://www.eoeandroid.com/thread-95111-1-1.html 今天实现了下屏幕截图 但是方法不是很优雅 还请大牛给予指点 界面很简单: <Linea...
  • duanyipeng
  • duanyipeng
  • 2013-01-19 19:53
  • 14987

Android 合并生成分享图片(View截图)

  • 2015-07-22 09:55
  • 174KB
  • 下载

Android对View截图和Activity截图

  • 2014-05-21 14:54
  • 651KB
  • 下载

Android中使用代码截图的各种方法总结

public class ScreenShot { private BufferedImage image = null; /** * @param args */ public sta...
  • woshinia
  • woshinia
  • 2013-09-10 11:17
  • 126274

android关于View的截图

一、截取缓存图片(当前屏幕显示的部分): 从ImageView对象中获取图像的方法,就是ImageView类中的getDrawingCache()方法,比如下面的代码就是从一个ImageView对象...
  • gebitan505
  • gebitan505
  • 2013-11-15 16:30
  • 13502
    个人资料
    • 访问:189363次
    • 积分:2768
    • 等级:
    • 排名:第14963名
    • 原创:82篇
    • 转载:13篇
    • 译文:6篇
    • 评论:57条
    我的Github
    博客专栏
    最新评论