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的方法,百度一下有很多,不再赘述。

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

时间: 2024-11-09 02:16:16

Android截屏SurfaceView黑屏问题的解决办法的相关文章

Android游戏开发 和黑屏问题,以及surfaceview

问题描述 Android游戏开发 和黑屏问题,以及surfaceview 完了这么多年游戏,现在终于做出了一款游戏,心情这个激动啊!没的说,可是我把游戏传到自己手机上不断测试,发现了一个问题,我按home键退出后再进去会一直黑屏,按返回键退出后再进去则不会,不知道是什么原因,求大虾解决,谢谢! 解决方案 http://blog.csdn.net/up1up2up3/article/details/40409623 这里有解释哦 解决方案二: 你可以重写home键和返回键事件检查或者处理 解决方案

Android app启动时黑屏或者白屏的原因及解决办法_Android

1.产生原因 其实显示黑屏或者白屏实属正常,这是因为还没加载到布局文件,就已经显示了window窗口背景,黑屏白屏就是window窗口背景. 示例: 2.解决办法 通过设置设置Style (1)设置背景图Theme 通过设置一张背景图. 当程序启动时,首先显示这张背景图,避免出现黑屏 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name=&qu

Android编程中activity启动时出现白屏、黑屏问题的解决方法_Android

本文实例讲述了Android编程中activity启动时出现白屏.黑屏问题的解决方法.分享给大家供大家参考,具体如下: 默认情况下 activity 启动的时候先把屏幕刷成白色,再绘制界面,绘制界面或多或少有点延迟,这段时间中你看到的就是白屏,显然影响用户体验,怎么消除呢? 在 Activity theme 设置style 即可 <style name="AppTheme" parent="android:Theme.Light.NoTitleBar">

Android Splash界面白屏、黑屏问题的解决方法_Android

前言 我相信很多Android开发同学都遇到过这样的需求:  1.实现一个Splash界面,界面上有应用相关的背景图片和一个开始按钮.  2.点击按钮之后进入主页,以后用户再打开应用就不显示这个Splash界面了.  也相信很多同学都遇到了这样的困惑:  •第二次进入应用,尽管你在Splash界面已经直接跳转到首页了,但是还是有个白屏或者黑屏或者带ActionBar的白屏闪现一下.  如果你也遇到这个问题,那就继续阅读这篇文章,我带大家去分析和解决这个问题. 解决方案 这里我们先给出解决方案,然

osx android studio虚拟机启动黑屏

问题描述 osx android studio虚拟机启动黑屏 osx 10.11 Android studio 1.4 HAXM is working and emulator runs in fast virt mode emulator: emulator window was out of view and was recentered 错误如上 虚拟机启动后一直黑屏,无响应.以前1.2的时候没问题

Android Splash界面白屏、黑屏问题的解决方法

前言 我相信很多Android开发同学都遇到过这样的需求: 1.实现一个Splash界面,界面上有应用相关的背景图片和一个开始按钮.  2.点击按钮之后进入主页,以后用户再打开应用就不显示这个Splash界面了. 也相信很多同学都遇到了这样的困惑:  •第二次进入应用,尽管你在Splash界面已经直接跳转到首页了,但是还是有个白屏或者黑屏或者带ActionBar的白屏闪现一下. 如果你也遇到这个问题,那就继续阅读这篇文章,我带大家去分析和解决这个问题. 解决方案 这里我们先给出解决方案,然后再具

Android app启动时黑屏或者白屏的原因及解决办法

1.产生原因 其实显示黑屏或者白屏实属正常,这是因为还没加载到布局文件,就已经显示了window窗口背景,黑屏白屏就是window窗口背景. 示例: 2.解决办法 通过设置设置Style (1)设置背景图Theme 通过设置一张背景图. 当程序启动时,首先显示这张背景图,避免出现黑屏 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name=&qu

pptv网络电视全屏后黑屏怎么解决

pptv网络电视全屏后黑屏怎么解决?经常使用pptv网络电视的朋友应该会碰到这些问题吧,下面平常软件下载站小编就教大家解决方法,有遇到类似情况的朋友可以来学习一下. 1.请您打开Windows Media Player播放器,然后选择"工具--选项--性能--高级",把"启用全屏模式切换"前面的勾去掉之后重启PPTV网络电视,看看是否能解决问题 2.如过上步操作无效,请您尝试不把Windows Media Player的视频加速调成"无",之后重

笔记本录屏出现黑屏如何解决

问题描述 笔记本录屏出现黑屏如何解决 用笔记本在录制屏幕生成视频的时候,为什么会出现黑屏,怎么样解决?尤其是录制游戏视频的时候 解决方案 因为DirectX等视频加速利用了直接画屏技术,而不通过GDI,所以没法截图.将视频加速关闭,方法是在显示属性-高级-疑难解答里面,设置为完全没有加速.不过这会导致游戏和视频播放的性能受损.检查下你的游戏或者播放器本身有没有截图和录像的功能. 解决方案二: 用台式机和独立显卡.