canvas画布会黑屏吗_Android截屏SurfaceView黑屏问题的解决办法

最近项目中有截屏的需求,普通的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 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);//获取画布

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, 100, 1000, 550), 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截屏SurfaceView黑屏问题的解决办法

本文地址: http://www.cppcns.com/ruanjian/android/192177.html

il2cpp分析-gobal-metadata.dat解密 打开ida,把libil2cpp拖到ida中按快捷键Shift+F12等待字符串分析完后,搜索global-metadata.dat。ida中双击sub_57EE7C进入,VS code中也跳转到LoadMetadataFile函数。VSCode打开il2cpp源代码,全局搜索global-metadata.dat。工具:010Editor,IDA 7.5,Jadx,VS Code。判断加密逻辑为根据文件的长度循环读取字节码做亦或加密。双击搜索出来的结果,切记要选il2cpp目录下的。 阅读详情

相关推荐

基于毫米波生物感知雷达+STM32设计的独居老人居家监护系统(微信小程序)(192)

当前基于STM32设计的独居老人居家监护系统为独居老人提供一种简便、实时的健康监护服务。该系统通过集成多种传感器和功能模块,能够实时监测老人的生理指标、姿态以及室内环境状况,并通过微信小程序远程显示数据,当出现异常情况时及时发出报警提醒。

1万+

解决html2canvas截取页面部分div黑屏问题

截取页面的部分div时出现上述问题 原因: 当转存图片格式为jpeg时截取整个页面没有问题,但截取部分div会有黑屏 将jpeg改为png时图片可正常显示。

qq_41318233的博客 3541

解决视频在截图时出现截取黑屏的情况

视频在截图时会出现截取黑屏的现象,但是可以通过禁用显示属性中的硬件加速设置来实现抓取视频画面的功能。

记录一次canvas绘制图片黑屏以及解决方案

最近遇在canvas的时候,在低端android机型上遇到了黑屏的情况,花了好长时间才解决,感兴趣可以解决方案: 文章地址: 记录一次canvas绘制图片黑屏以及解决方案

weixin_40863414的博客 2845

video使用canvas截图黑屏

截图黑屏问题 使用canvas对video进行截图出现黑屏,主要原因是 drawImage的第一个参数需要是 HTMLImageELement,或者是HTMLVideoElement。而我们通过id获取到的元素是包了一层div,需要获取它的子节点 var videoTag = document.getElementById('my-video'); var canvas = document.getElementById('canvas'); var context = canvas.getContext(

weixin_43090627的博客 3517

canvas画布黑屏吗_鸿蒙2.0 JavaScript / JS 入门教程(四)组件概览之媒体及画布组件...

本文呈现各组件有意义的最简形式(不包含额外样式),以形成初步直观的印象。可能TV比智能穿戴设备支持的组件多一些,为了简便,本文只显示TV中的组件。并且由于智能穿戴的屏幕为圆形,很多时候需要设置CSS的高宽和居中,否则可能会出现黑屏或组件一部分在屏幕外的情况。文中代码均为hml文件中的代码,如果有js文件中的代码会特别说明媒体组件暂时只支持智慧屏设备!video视频播放组件canvas画布组件1. ...

weixin_31304499的博客 287

canvas画布黑屏吗_Android截屏SurfaceView黑屏问题解决办法

最近项目中有截屏的需求,普通的view截屏方法网上一搜一大把,但是SurfaceView截屏黑屏问题很多文章说的并不清楚,自己参考了一些别的博客,再加上自己的思考,算是找到了一种解决方案。1、首先看我们一般是怎么用SurfaceView的public class SuperSurfaceView extends SurfaceView implements SurfaceHolder.Callba...

weixin_39622710的博客 250

Android--SurfaceView截屏问题

 转载▼ 标签: it 分类: Android 一般的View截屏实现代码如下: View view = activity.getWindow().getDecorView();   view.setDrawingCacheEnabled(true);     view.buildDrawingCache();   Bitmap

yuanyuan_186的专栏 4225

Android中截图(surfaceView

前几天,在网上总结了一个方法,实现了在Android当前Activity的截图,本人测试确实通过了,不过有朋友说截出来的图是黑色的,不能看。我心想,这没有问题啊,相同的代码我就可以执行通过,并没有没有在意这个问题。可是,今天我再调用那个方法时,截出来的图部分是黑屏。我当时就郁闷了。网上的东西很全,但同时很乱。有一个大神用的是引用Linux下编译出来的库,又用到什么JNI我完全不懂,貌似可以实现截屏

丕子李 2万+

android linux截图库,Android中截图(surfaceView)源码

总结了一个方法,实现了在Android当前Activity的截图,本人测试确实通过了,不过有朋友说截出来的图是黑色的,不能看。我心想,这没有问题啊,相同的代码我就可以执行通过,并没有没有在意这个问题。可是,今天我再调用那个方法时,截出来的图部分是黑屏。我当时就郁闷了。网上的东西很全,但同时很乱。有一个大神用的是引用Linux下编译出来的库,又用到什么JNI我完全不懂,貌似可以实现截屏。当时这个方法...

weixin_35908791的博客 211

Android应用防截屏技术全解析:从FLAG_SECURE到精细化安全控制

在移动应用开发中,数据安全与隐私保护是核心议题。Android系统提供了视图渲染和窗口管理机制,允许开发者控制屏幕内容的捕获行为。通过系统级的安全标志位,可以防止敏感信息被非法截取,这在金融交易、企业通讯等场景中具有重要技术价值。FLAG_SECURE作为基础防护手段,结合SurfaceView的独立表面控制,能够有效拦截系统截屏和录屏操作。对于需要局部保护的场景,开发者可以通过动态窗口标志管理或自定义安全容器视图实现精细化控制。本文深入探讨了Android截屏的实现原理,涵盖了FLAG_SECURE、S

weixin_33736649的博客 476

surfaceview播放视频截图黑屏

不多说,直接上码!(原理是把视频去帧,保存到画布,然后把当前屏幕截图,然后再画到画布上)     @SuppressLint("NewApi")     private void savaScreenShot() {         // 构建Bitmap                 WindowManager windowManager = getWindowManager();

体验Android编程之美 4080

androidandroid2.2截屏研究(1)

一、调用api接口view.getDrawingCache()获取抓取当前屏幕的截图 调用接口view.getDrawingCache()获取当前绘制缓存中的位图 package com.screenshoot; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io....

weixin_34235105的博客 103

游戏内截图,surfaceView截图

项目中需要在游戏中截图并保存到相册下,花了一点时间研究了下,查看了很多文章,走了不少弯路,终于把截图功能做出来了.在此记一下实现过程.

芒酱的博客 1958

运用插件html2canvas浏览器截屏的方法

记得把这个属性设置为true;不然下载的图片是黑屏。首先先安装 html2canvas 插件。然后就直接可以截图了。

weixin_47481630的博客 710

HTML5-canvas绘图黑屏白屏解决方案(详解双缓冲绘图机制)

HTML5-canvas绘图黑屏白屏解决方案(详解双缓冲绘图机制) 使用canvas绘图的前端工程师可能都会遇到过canvas绘图黑屏、白屏的问题。以前写过一篇文章描述过hybrid下canvas黑屏的一种可能性: http://blog.csdn.net/yuhk231/article/details/53560782 那么如果我们面对的场景就是移动端各大浏览器呢?当出现黑屏、白屏的时候就...

大菜鸟的博客 1万+

记OpenGL的Demo中增加ImGui后界面不显示的问题

经过不断调整代码,也可能是对这还不太熟悉吧,最终将drawData放在clearColor后界面出来了,仔细想想也能理解,先画了界面,再渲染了背景色,将界面盖住了。我的ImGui界面呢?

千里小马哥的博客 566

canvas 画布

绘制轮廓矩形 参数 x轴起始位置 y轴起始位置 宽 高。canvas在页面设置出一块空白位置,为我们绘制涂写。

ljj07220602的博客 1354

使用canvas获取视频某一秒做封面,解决黑屏问题

实现上传视频后,截图视频的某一秒当封面 主要技术要点,使用canvas的 drawImage 方法,在把获取到的资源使用toDataURL转成base64格式 监听视频的 onerror 方法,解决了有些视频如果截取第一帧时,可能是黑屏问题 <body> <h3>上传视频后截取视频图片</h3> <input id="videoUpload" type="file" accept="video/*" /> </body> le

希文Gershwin 3187

XFOIL_matlab_xfoil_MATLABXFFOIL_翼型_翼型优化.zip

XFOIL_matlab_xfoil_MATLABXFFOIL_翼型_翼型优化.zip

上一篇: 串口监听工具listen_串口调试工具(读取温度值)
下一篇: hfss螺旋平面_利用HFSS设计平面等角螺旋天线.pdf
weixin_39710179
博客等级 码龄9年 37粉丝 165原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值