服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - android view转Bitmap生成截图的方法

android view转Bitmap生成截图的方法

2022-07-29 10:55程序猿tx Android

这篇文章主要介绍了android view转Bitmap生成截图的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

项目中经常会用到分享的功能,有分享链接也有分享图片,其中分享图片有的需要移动端对屏幕内容进行截取分享,说白了就是将view 转成bitmap 再到图片分享,还有一种情况是将不可见的view 转成bitmap ,这种view是没有直接显示在界面上的,需要我们使用inflate 进行创建的view。

第一种

先看通过 DrawingCache 方法来截取普通的view,获取它的视图(Bitmap)。

?
1
2
3
4
5
private Bitmap createBitmap(View view) {
  view.buildDrawingCache();
  Bitmap bitmap = view.getDrawingCache();
  return bitmap;
}

这个方法适用于view 已经显示在界面上了,可以获得view 的宽高实际大小,进而通过DrawingCache 保存为bitmap。

第二种

但是 如果要截取的view 没有在屏幕上显示完全的,例如要截取的是超过一屏的 scrollview ,通过上面这个方法是获取不到bitmap的,需要使用下面方法,传的view 是scrollview 的子view(LinearLayout)等, 当然完全显示的view(第一种情况的view) 也可以使用这个方法截取。

?
1
2
3
4
5
6
7
public Bitmap createBitmap2(View v) {
  Bitmap bmp = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);
  Canvas c = new Canvas(bmp);
  c.drawColor(Color.WHITE);
  v.draw(c);
  return bmp;
}

第三种

还有一种 是view完全没有显示在界面上,通过inflate 转化的view,这时候通过 DrawingCache 是获取不到bitmap 的,也拿不到view 的宽高,以上两种方法都是不可行的。第三种方法通过measure、layout 去获得view 的实际尺寸。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public Bitmap createBitmap3(View v, int width, int height) {
  //测量使得view指定大小
  int measuredWidth = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY);
  int measuredHeight = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY);
  v.measure(measuredWidth, measuredHeight);
  //调用layout方法布局后,可以得到view的尺寸大小
  v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
  Bitmap bmp = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);
  Canvas c = new Canvas(bmp);
  c.drawColor(Color.WHITE);
  v.draw(c);
  return bmp;
}
 
 
View view = LayoutInflater.from(this).inflate(R.layout.view_inflate, null, false);
//这里传值屏幕宽高,得到的视图即全屏大小
createBitmap3(view, getScreenWidth(), getScreenHeight());

另外写了个简易的保存图片的方法,方便查看效果的。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
private void saveBitmap(Bitmap bitmap) {
  FileOutputStream fos;
  try {
    File root = Environment.getExternalStorageDirectory();
    File file = new File(root, "test.png");
    fos = new FileOutputStream(file);
    bitmap.compress(Bitmap.CompressFormat.PNG, 90, fos);
    fos.flush();
    fos.close();
  } catch (Exception e) {
    e.printStackTrace();
  }
}

github地址:https://github.com/taixiang/view2bitmap

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://segmentfault.com/a/1190000016241822

延伸 · 阅读

精彩推荐
  • AndroidAndroid 数据存储方式有哪几种

    Android 数据存储方式有哪几种

    android为数据存储提供了五种方式,有SharedPreferences、文件存储、SQLite数据库、ContentProvider、网络存储,对android数据存储方式感兴趣的朋友可以通过本文学习...

    doodle7773982021-04-08
  • AndroidAndroid调用微信登陆、分享、支付

    Android调用微信登陆、分享、支付

    这篇文章主要介绍了Android调用微信登陆、分享、支付的相关资料,需要的朋友可以参考下...

    AnsenCode11232021-04-26
  • AndroidAndroid编程实现TextView字体颜色设置的方法小结

    Android编程实现TextView字体颜色设置的方法小结

    这篇文章主要介绍了Android编程实现TextView字体颜色设置的方法,结合实例形式总结分析了Android针对TextView字体颜色设置的相关步骤与注意事项,具有一定参考...

    fengyee_zju8082021-04-16
  • AndroidAndroid布局之RelativeLayout相对布局

    Android布局之RelativeLayout相对布局

    RelativeLayout是相对布局控件:以控件之间相对位置或相对父容器位置进行排列,下面通过本文给大家介绍Android布局之RelativeLayout相对布局,涉及到android re...

    Android教程网6812021-04-28
  • AndroidAndroid ListView详解

    Android ListView详解

    listview控件在项目开发过程中经常会用到,本文给大家分享android listview相关知识,感兴趣的朋友一起学习吧...

    jerrylsxu4482021-04-19
  • AndroidAndroid 双进程守护的实现代码

    Android 双进程守护的实现代码

    这篇文章主要介绍了Android 双进程守护的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    reggie199610972022-07-19
  • AndroidAndroid编程之短信窃听器实现方法

    Android编程之短信窃听器实现方法

    这篇文章主要介绍了Android编程之短信窃听器实现方法,以实例形式较为详细的分析了Android编程实现窃听器的具体步骤与实现技巧,具有一定参考借鉴价值,需...

    xy84928832111152021-04-12
  • AndroidAndroid自定义view制作绚丽的验证码

    Android自定义view制作绚丽的验证码

    这篇文章主要介绍了Android自定义view制作绚丽的验证码的相关资料,需要的朋友可以参考下...

    ydxlt12352021-06-23