首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在图像视图下,SurfaceView无法绘制

是因为SurfaceView的绘制是在独立的线程中进行的,而不是在主线程中进行的。这种设计可以提高绘制的效率,但也带来了一些限制。

SurfaceView是Android中用于在后台线程中进行绘制的视图组件。它与普通的View不同,SurfaceView拥有一个独立的绘制表面(Surface),可以在后台线程中进行绘制操作,而不会阻塞主线程。这对于需要频繁更新的图像、视频播放等场景非常有用。

然而,由于SurfaceView的绘制是在独立的线程中进行的,与主线程分离,因此在图像视图下,SurfaceView无法直接进行绘制。这是因为图像视图是在主线程中进行绘制的,而SurfaceView的绘制是在独立线程中进行的,两者无法直接交互。

解决这个问题的方法是通过使用双缓冲技术,将SurfaceView的绘制结果绘制到一个Bitmap上,然后将Bitmap绘制到图像视图上。这样就可以在图像视图下显示SurfaceView的内容。

在Android中,可以使用Canvas和Bitmap来实现双缓冲。首先,在SurfaceView的绘制线程中,将绘制结果绘制到一个Bitmap上。然后,在主线程中,将Bitmap绘制到图像视图上。这样就可以在图像视图下显示SurfaceView的内容。

另外,如果需要在图像视图下绘制图像,也可以考虑使用其他的视图组件,如ImageView。ImageView是Android中用于显示图像的视图组件,可以直接在主线程中进行绘制,适合在图像视图下进行绘制操作。

总结起来,SurfaceView无法在图像视图下直接进行绘制,因为SurfaceView的绘制是在独立的线程中进行的。解决这个问题的方法是通过双缓冲技术,将SurfaceView的绘制结果绘制到一个Bitmap上,然后将Bitmap绘制到图像视图上。另外,也可以考虑使用其他的视图组件,如ImageView,来在图像视图下进行绘制操作。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

android视频系列:视频解码篇--android上视频播放的实现

暂留时间结束前,放入下一张图,人就感觉不出来是一张张的图,而是连续的动画了。移动终端上观看的视频,每秒25帧图像,就很流畅了。一秒钟放的图像数,被称为帧率。...紧接着下个问题就来了: 一秒钟25帧图像,那么100秒的视频,容器里需要放置2500张图像,这是很大的数据量。无论存储还是传播,都是无法接受的。需要想办法减小数据量。...但是,我们无法控制它们的数据通路。要牢牢控制每一帧的数据,就要使用下面这种实现。 3....使用MediaPlayer和GLSurfaceView播放视频 GLSurfaceView继承自SurfaceView,它实现了把opengl的渲染结果,绘制到给定的Surface里,进而可以显示屏幕上...官方推荐在此处做投影和口变换,但是,通常情形下,不会发生size变化,所以为了简化实现,往往保持该方法为空。 onDrawFrame()的调用发生在绘制当前帧时。

3.9K131

Android利用SurfaceView显示Camera图像爬坑记(五) -- 现有项目中加入NDK配置

前言 前面几章我们已经把SurfaceView加载Camera实现实时帧显示图像完成了,我也说过,我们加载实时图像是为了对接OpenCV进行图像处理所以才生成的Bitmap图像。...《OpenCV4Android中NDK开发(一)--- OpenCV4.1.0环境搭建》这篇中我们是新建的项目中直接选择了包含C++,本篇主要是介绍怎么现在的项目加改为使用JNI的方式。...${log-lib}) 然后我们cpp文件夹下再建一个native-lib.cpp的文件,这个文件名主要是根据CMakeList.txt里面配置相同的,我们也可以改别的名,不过CMakeList.txt...android下的defaultConfig下加入Cmake的配置 externalNativeBuild { cmake {...生成完后可以看到左边红框里面已经出来cpp目录和下面的Cmakelist及native-lib.cpp的文件了,这就说明我们现有项目中添加JNI成功了。 -END-

88720

SurfaceView 与 TextureView 详解

传统View及其派生类的更新只能在UI线程,然而UI线程还同时处理其他交互逻辑,这就无法保证view更新的速度和帧率了,而SurfaceView可以用独立的线程来进行绘制。...这个接口通常通过SurfaceView类实现。 简单的说就是我们无法直接操作Surface只能通过SurfaceHolder这个接口来获取和操作Surface。...首先,SurfaceTexture从图像流 (来自Camera预览、视频解码、GL绘制场景等) 中获得帧数据,当调用updateTexImage()时,根据内容流中最近的图像更新 SurfaceTexture...区别在于TextureView是View hierachy中做绘制,因此一般它是主线程上做的(Android 5.0引入渲染线程后,它是渲染线程中做的)。...而SurfaceView+SurfaceTexture单独的Surface上做绘制,可以是用户提供的线程,而不是系统的主线程或是渲染线程。

12.1K60

走进SurfaceView

但它也有缺点,因为这个Surface不在View hierachy中,它的显示也不受View的属性控制,所以不能进行平移,缩放等变换,也不能放在其它ViewGroup中,一些View中的特性也无法使用。...图像预览中就使用该类型的Surface,有Camera负责提供给预览Surface数据,这样图像预览会比较流畅。...需要注意的是,高版本的Android SDK中,setType这个方法已经被depreciated了。 2、3、4中的同步锁机制的目的,就是为了绘制的过程中,Surface中的数据不会被改变。...而SurfaceHolder.Callback是SurfaceHolder内部的静态子接口 06 — SurfaceView的优缺点 1、优点: 可以一个独立的线程中进行界面绘制,不会影响主线程,...例如,如果你已经先后两次绘制了视图A和B,那么你再调用lockCanvas()获取视图,获得的将是A而不是正在显示的B,之后你将重绘的C视图上传,那么C将取代B作为新的frontCanvas显示SurfaceView

1.3K20

Android相机开发那些坑

setPreviewDisplay(SurfaceHolder):绑定绘制预览图像的surface。...surface是指向屏幕窗口原始图像缓冲区(raw buffer)的一个句柄,通过它可以获得这块屏幕上对应的canvas,进而完成屏幕上绘制View的工作。...shutter是快门按下时的回调,raw是获取拍照原始数据的回调,jpeg是获取经过压缩成jpg格式的图像数据的回调。 SurfaceView:用于绘制相机预览图像的类,提供给用户实时的预览图像。...由于UI线程还要同时处理其他交互逻辑,因此对view的更新速度和帧率无法保证,而surfaceview由于持有一个独立的surface,因而可以独立的线程中进行绘制,因此可以提供更高的帧率。...开发过程遇到的一些坑 下面再讲讲我开发自定义相机时踩过的一些坑: 1. Activity设为竖屏时,SurfaceView预览图像颠倒90度。

29.4K50

Android开发笔记(五十六)摄像头拍照

第一个参数ShutterCallback用来控制按下快门时的事件,我们可在此播放拍照声音,默认就是咔嚓一声;后面的几个回调接口PictureCallback分别对应原始图像、缩放和压缩图像和JPG图像,...图像数据可以接口中的onPictureTaken方法中获得,通常我们只关心最后一个的JPG图像数据,所以前面的接口参数可以直接传null。...由于拥有独立的绘图表面,因此SurfaceView的界面就可以一个独立的线程中进行绘制,我们称之为渲染线程。因为它不占用主线程资源,所以一方面可以实现复杂而高效的UI,另一方面也会及时响应用户输入。...该方法用于关联SurfaceView和SurfaceHolder,它与Camera.setPreviewDisplay最终联合完成SurfaceView与Camera的关联,即摄像头的画面展示预览界面上...注意SurfaceView的渲染线程只surfaceCreated和surfaceDestroyed之间有效,所以如果在别处操作SurfaceView画面,得判断当前预览界面是否有效,也就是调用SurfaceHolder.isCreating

1.8K20

聊聊SurfaceView和TextureView

缺点:因为这个Surface不在View hierachy中,它的显示也不受View的属性控制,所以不能进行平移,缩放等变换,也不能放在其它ViewGroup中,一些View中的特性也无法使用。...用了一个画布,将所有内容都先画到画布上,整体绘制到窗口上,就该叫做单缓冲绘图,那个画布就是一个缓冲区。 用了两个画布,一个进行临时的绘图,一个进行最终的绘图,这样就叫做双缓冲绘图。...和backCanvas每一次绘制完了之后会交换,frontCanvas变成backCanvas,backCanvas变成frontCanvas。...TextureView继承自View,它与其它的View一样View hierachy中管理与绘制。...TextureView重载了draw()方法,其中主要SurfaceTexture中收到的图像数据作为纹理更新到对应的HardwareLayer中。

4.1K21

音视频直播技术--视频的渲染与展示

Surfaceview 提供了一个可见区域,只有在这个可见区域内的Surface部分内容才可见,可见区域外的部分不可见。 传统的View共享一块屏幕缓冲区,所有的绘制必须在UI线程中进行。...系统的WMS(Windows Manager Service)管理,所以它也不会像普通View那样可以通过View属性控制进行平移,缩放等变换,也不能放在其它ViewGroup中,一些View中的特性也无法使用...Surfaceview的核心在于提供了两个线程:UI线程和渲染线程。UI线程用于绘制,渲染线程用于纹理的计算。...它的加入是为了解决SurfaceView渲染线程要单独写开发难度大这个问题而引入的。 SurfaceView 的基础上,它加入了EGL的管理,并自带了渲染线程。...TextureView 重载了draw()方法,其中主要把SurfaceTexture中收到的图像数据作为纹理更新到对应的HardwareLayer中。

1.4K30

【Android FFMPEG 开发】FFMPEG ANativeWindow 原生绘制 ( 设置 ANativeWindow 缓冲区属性 | 获取绘制缓冲区 | 填充数据到缓冲区 | 启动绘制 )

原生绘制 准备工作 , 然后才能进行下面的操作 ; ① Java 层获取 Surface 对象 ( 上一篇博客讲解 ) : Surface 画布可以 SurfaceView 的 SurfaceHolder...中获取 //绘制图像SurfaceView SurfaceView surfaceView; // SurfaceView 回调函数中获取 SurfaceHolder surfaceHolder...绘制窗口属性设置 : 绘制图像之前 , 首先要设置绘制的 宽度 , 高度 , 绘制像素格式 ( ARGB ) , 调用 ANativeWindow_setBuffersGeometry ( ) 方法..., 就可以将图像绘制到 ANativeWindow 中 , 即 Surface 所在的 SurfaceView 中 ; 调用 ANativeWindow_lock ( ) 方法可以获取该绘制缓冲区 ;...填充图像图像数据到 ANativeWindow_Buffer 绘制缓冲区 ---- 转换好的图像数据 : 博客 【Android FFMPEG 开发】FFMPEG AVFrame 图像格式转换 YUV

91010

Android播放端绘制-SurfaceView还是GLSurfaceView

我们使用SurfaceView其实最终都是获取到这个Surface去绘制,可参看官方解释: Provides a dedicated drawing surface embedded inside of...绘制过程: 通过SurfaceHolder.getSurface可以获取到Surface; 通过Surface.lockCanvas可以获取到Surface的Canvas; 使用Canvas绘制图像;...GLSurfaceView GLSurfaceView继承自SurfaceView,对SurfaceView又做了一次封装,方便我们安卓中使用OpenGL。...提供并且管理一个EGL display,它能让opengl把内容渲染到上述的Surface上; 支持用户自定义渲染器(Render),通过setRenderer设置一个自定义的Renderer; 让渲染器独立的...,SurfaceView使用画布进行绘制,GLSurfaceView利用GPU加速提高了绘制效率; View的绘制onDraw(Canvas canvas)使用Skia渲染引擎渲染,而GLSurfaceView

1.5K20

android SurfaceView绘制实现原理解析

由于拥有独立的绘图表面,因此SurfaceView的UI就可以一个独立的线程中进行绘制。...SurfaceView还有另外一个窗口类型TYPE_APPLICATION_MEDIA_OVERLAY,它是用来视频上面显示一个Overlay的,这个Overlay可以用来显示字幕等信息。        ...绘图表面创建一块内存,并且将采集的预览图像数据或者视频帧数据源源不断地填充到该内存中去。...注意,如果当前正在处理的SurfaceView的成员变量mWindow的值等于null,那么就说明它的绘图表面还没有创建好,这时候就无法创建一块画布返回给调用者。...同时,如果当前正在处理的SurfaceView的绘图表面已经创建好,但是该SurfaceView当前是处于停止绘制的状态,即它的成员变量mDrawingStopped的值等于true,那么也是无法创建一块画布返回给调用者的

5.5K131

Android SurfaceView学习示例

使用OpenGL,你可以再Surface上绘制任何支持的2D或者3D对象,与2D画布上模拟相同的效果相比,这种方法可以依靠硬件加速(可用的时候)来极大地提高性能。 ...对于显示动态的3D图像来说,例如,那些使用Google Earth功能的应用程序,或者那些提供沉浸体验的交互式游戏,SurfaceView特别有用。它还是实时显示摄像头预览的最佳选择。 ...SurfaceView 和 View 的明显不同之处在于: 1、继承SurfaceView  的视图可以另起一个线程,或者说子线程中更新视图。...2、 SurfaceView 的画图方法是子线程中执行的 而 View类的那个示例 的画图方法是UI线程中执行的。...3、SurfaceView绘图之前必须使用lockCanvas 方法锁定画布,并得到画布,然后再画布上绘制;当绘制完成后,使用unlockCanvasAndPost 方法解锁画布,然后就显示到屏幕上。

88330

【Android 音视频开发打怪升级:OpenGL渲染视频画面篇】四、深入了解OpenGL之EGL

第一种是最常用的,通常将页面上的SurfaceView持有的Surface,或SurfaceTexture传递进去进行绑定。这样OpenGL处理的图像数据就可以显示屏幕上。...---- 现在来回答上面提出的问题:为什么OpenGL可以多个GLSurfaceView中正确绘制?...EGL初始化以后,即渲染环境(EGLDisplay、EGLContext、GLSurface)准备就绪以后,需要在渲染线程(绘制图像的线程)中,明确的调用glMakeCurrent。...OpenGL绘制图像化,调用该方法,才能真正显示出来。 解绑数据缓存表面,以及释放资源 当页面上的Surface被销毁(比如App到后台)的时候,需要将资源解绑。...三、EGL的用途 1,加深对OpenGL认识 如果你没有认真学习过EGL,那么你的OpenGL生涯将是不完整的,因为你始终无法深刻的认识到OpenGL渲染机制是怎样的,那么处理一些的问题的时候,就会显得很无力

2.3K20

什么是 SurfaceView

SurfaceView简介 简单的说SurfaceView就是一个有Surface的View里面内嵌了一个专门用于绘制的Surface,SurfaceView控制这个Surface的格式和尺寸以及绘制位置...传统View及其派生类的更新只能在UI线程,然而UI线程还同时处理其他交互逻辑, 这就无法保证view更新的速度和帧率了,而SurfaceView可以用独立的线程来进行绘制,因此可以提供更高的帧率,例如游戏...例如,如果你已经先后两次绘制了视图A和B,那么你再调用lockCanvas()获取视图,获得的将是A而不是正在显示的B,之后你将重绘的C视图上传,那么C将取代B作为新的frontCanvas显示SurfaceView...所以它的优点就是可以独立的线程中绘制,不影响主线程,而且使用双缓冲机制,播放视频时画面更顺畅。...这个接口通常通过SurfaceView类实现。 简单的说就是我们无法直接操作Surface只能通过SurfaceHolder这个接口来获取和操作Surface。

1.1K11
领券