搜索热词

最近项目中有截屏的需求,普通的view截屏方法网上一搜一大把,但是SurfaceView截屏黑屏问题很多文章说的并不清楚,自己参考了一些别的博客,再加上自己的思考,算是找到了一种解决方案。

1、首先看我们一般是怎么用SurfaceView的

public class SuperSurfaceView extends SurfaceView implements SurfaceHolder.Callback {

SurfaceHolder surfaceHolder;

public SuperSurfaceView(Context context) {

super(context);

surfaceHolder = this.getHolder();

surfaceHolder.addCallback(this);

}

@Override

public void surfaceChanged(SurfaceHolder holder,int format,int width,int height) {

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

new Thread(new MyThread()).start();

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

}

class MyThread implements Runnable {

@Override

public void run() {

Canvas canvas = surfaceHolder.lockCanvas(null);//获取画布

Paint mPaint = new Paint();

mPaint.setColor(Color.BLUE);

canvas.drawRect(new RectF(100,100,1000,550),mPaint);

surfaceHolder.unlockCanvasAndPost(canvas);//解锁画布,提交画好的图像

}

}

}

从以上代码中,可以看到在MyThread的run方法中创建了一块画布,进行SurfaceView的绘制,但是我们知道SurfaceView是双缓冲机制,这个Canvas上的内容我们拿不到,所以截屏出来是黑屏。所以,要拿到这个画布上的内容,就自己创建一个画布,将这些内容画到自己的Canvas上,就可以了。

2、拿到SurfaceView画布上的bitmap,看修改过后的代码

public abstract class SuperSurfaceView extends SurfaceView implements SurfaceHolder.Callback {

SurfaceHolder surfaceHolder;

public SuperSurfaceView(Context context) {

super(context);

surfaceHolder = this.getHolder();

surfaceHolder.addCallback(this);

}

@Override

public void surfaceChanged(SurfaceHolder holder,int height) {

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

new Thread(new MyThread()).start();

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

}

class MyThread implements Runnable {

@Override

public void run() {

Canvas canvas = surfaceHolder.lockCanvas(null);//获取画布

doDraw(canvas);

surfaceHolder.unlockCanvasAndPost(canvas);//解锁画布,提交画好的图像

}

}

//将绘制图案的方法抽象出来,让子类实现,调用getBitmap方法时就会调用此方法

protected abstract void doDraw(Canvas canvas);

//调用该方法将doDraw绘制的图案绘制在自己的canvas上

public Bitmap getBitmap() {

Bitmap bitmap = Bitmap.createBitmap(getWidth(),getHeight(),Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(bitmap);

doDraw(canvas);

return bitmap;

}

}

3、下面看MainActivity中如何使用

Button bt = (Button) findViewById(R.id.bt);

FrameLayout fl = (FrameLayout) findViewById(R.id.fl);

//用到surfaceview需继承SuperSurfaceView才能截到屏,否则截出来是黑屏

SuperSurfaceView surfaceView = new SuperSurfaceView(this) {

@Override

protected void doDraw(Canvas canvas) {

Paint mPaint = new Paint();

mPaint.setColor(Color.BLUE);

canvas.drawRect(new RectF(100,mPaint);

}

};

fl.addView(surfaceView);

bt.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

//调用该方法即可得到surfaceview上绘制的图案

Bitmap bitmap = surfaceView.getBitmap();

}

});

补充:如果界面上还有其他控件需要一起截屏,可以将截到的surfaceview的bitmap和用普通办法截到的不含surfaceview的bitmap拼接起来就OK了,至于两个bitmap合为一个bitmap的方法,百度一下有很多,不再赘述。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

android截屏方法是黑屏,Android截屏SurfaceView黑屏问题的解决办法相关推荐

  1. maxlength不起作用android,Android EditText设置Filter以后(xml布局文件中maxLength不起作用的解决办法)...

    Android EditText设置Filter以后,xml布局文件中maxLength不起作用的解决办法 问题发现 最近项目里有个需求,文本框禁用emoji表情的输入,因为用到的地方较多,第一个想到 ...

  2. android 按键铺满屏幕,安卓全屏状态下键盘充满屏幕留不出ui控件的解决办法附edittext和键盘的属性...

    1.我们先看看常用和不常用的属性值(Edittext) android:inputType参数类型说明 android:inputType="none"--输入普通字符 andro ...

  3. android studio clone 方法不能先用,Android Studio中使用git功能无法clone原因分析

    最近在使用git的时候发现一个非常诡异的问题,我用cmd命令行可以进行clone,push,pull等操作时都可以完美的成功,但是换到Android Studio中进行这些与远程库的操作的时候,就是各 ...

  4. Android之通过VideoView控件播放一个视频出现的问题以及我的解决办法

    1.在Android模拟器中是可以播放视频的,可播放视频的格式为3gp.mp4.mkv等,其中我们使用VideoView控件播放一个视频时,部署到模拟器上,往往会弹出一个对话框,如下图所示: 我认为出 ...

  5. 关于Android Studio 4.1采用华为荣耀平板真机调试logcat不显示的解决办法

    问题分析 本人安卓开发初学者.在学习的过程中,利用手头上的一个荣耀waterplay平板做真机调试.在采用Android Studio 3.X的版本时,平板是可以正常输出logcat的,最近升级到4. ...

  6. 编译Android源码,执行lunch命令时报错“No such file: /root/.lunchrc”的解决办法

    1.问题描述: 在编译Android系统源码时,执行#lunch命令,报"No such file: /root/.lunchrc"错误,现象如图所示. 2.解决办法: 将系统源码 ...

  7. 黑群晖找不到设备_安装黑群晖必须知道的几个问题和解决办法

    安装过程遇到的问题 1.搜索不到ip 这个的解决办法是换引导,可以尝试6.1或者6.2里面的不同版本DS918+.DS3617xs.DS3615xs,或者引导里面加入自定义的扩展驱动extra.lzm ...

  8. Colab使用方法,以及读取Google drive中的文件太慢的解决办法(亲测有效)

    前言:使用云端硬盘和Colab得能科学上网啊,fq方法自己去摸索吧(捂嘴笑 回到正文!!!! 一.文件上传到Google的云端硬盘上 1.点击左上角的新建 2.点击上传文件或者上传文件即可上传:上传会 ...

  9. 鼠标光标变成黑块变粗导致影响输入的原因以及解决办法

    鼠标光标变成黑块变粗,理论原因是不小心触发了电脑键盘某个键导致电脑进入了改写(覆盖)状态. 解决办法:据说是再按一次INSERT键.

  10. android中static方法,StaticLayout如何在Android中使用?

    StaticLayout(similar to DynamicLayout and BoringLayout)用于在画布上布局和绘制文本.它通常用于以下任务: >测量布局后多行文字的大小. &g ...

最新文章

  1. SAP登录IP绑定校验
  2. SAP内部订单使用实例
  3. linux下socket上限,[100分]高分求关于linux socket上限解决方案
  4. 环境搭建:如何配置 vscode 远程开发 + 免密登录
  5. 杨森翔的书法:书法 马凯诗
  6. Java面向对象(20)--接口
  7. 【笔试常考】C语言:深度剖析strlen,sizeof
  8. 2020年快手美妆行业数据价值报告
  9. 【数据结构 严蔚敏版】 链表基本操作
  10. Linux下mongodb用户管理和设置远程登陆
  11. 值得收藏,分享3个的 Python 实战项目
  12. Pyserial安装
  13. 如何清除计算机开机密码,电脑开机密码忘了怎么办?教你用PE工具清除开机密码...
  14. 南通大学杏林学院计算机专业,南通大学杏林学院代码
  15. 使用FFmpeg转录网络直播流
  16. 火影抽卡模拟器1.0.5
  17. jupyter notebook 中运行from scipy import stats之后报错FutureWarning:
  18. UltraEdit 多词搜索
  19. 人工智能学习笔记 python实现梯度下降法对多元函数求解
  20. 《欢乐颂2》狗血的剧情才是生活该有的模样

热门文章

  1. 对称密钥交换协议——实现在不安全的信道安全地传输密钥
  2. Xshell 3.0序列号注册激活教程
  3. 单片机花灯开关控制器C语言代码,以51单片机为核心的LED彩灯控制器设计
  4. python实现定时自动发送qq消息
  5. 北斗卫星导航有哪些频段
  6. amr转换成mp3 java_微信开发-将amr格式转换为mp3格式
  7. 东北大学c语言作业答案,{东北大学}2018年秋学期《画法几何及土木建筑制图》在线作业2课后参考答案...
  8. UG二次开发-基础篇:GRIP函数查询表与帮助文档
  9. Python 爬虫入门(一)——爬取糗百
  10. 关键系统进程 C:\Windows\system32\lsass.exe 失败,状态代码是 255。现在必须重新启动计算机。