网站开发要学些什么,常见网页制作工具,WordPress菜单调用不出,基础建设的网站有哪些内容GLSurfaceView 和 SurfaceView 是 Android 中用于显示图像的两个视图类#xff0c;它们在实现方式和使用场景上有一些区别。
实现方式#xff1a;GLSurfaceView 基于 OpenGL ES 技术实现#xff0c;可以通过 OpenGL ES 渲染图像。而 SurfaceView 则是通过基于线程的绘制方式…GLSurfaceView 和 SurfaceView 是 Android 中用于显示图像的两个视图类它们在实现方式和使用场景上有一些区别。
实现方式GLSurfaceView 基于 OpenGL ES 技术实现可以通过 OpenGL ES 渲染图像。而 SurfaceView 则是通过基于线程的绘制方式可以在独立的线程中进行绘制操作。性能由于 GLSurfaceView 使用了 OpenGL ES 技术可以充分利用 GPU 进行图像渲染因此在处理复杂图像和动画时通常具有更好的性能。相比之下SurfaceView 使用 CPU 进行图像绘制性能可能相对较低。使用场景如果你需要进行复杂的图形绘制、图像处理或者动画那么 GLSurfaceView 是一个更好的选择因为它提供了强大的 OpenGL ES 功能支持。另外GLSurfaceView 还可以与其他 OpenGL ES 相关的库和工具进行集成。而 SurfaceView 在一些简单的图像展示场景中更常见例如显示图片、播放视频等。使用复杂度由于 GLSurfaceView 使用了 OpenGL ES因此它需要编写着色器程序来进行图像渲染并且需要处理 OpenGL ES 相关的上下文管理。相对而言SurfaceView 的使用相对简单只需继承 SurfaceView 类并实现自定义的绘制逻辑即可。
需要注意的是由于 GLSurfaceView 使用了 OpenGL ES 技术它对开发者的要求更高需要熟悉 OpenGL ES 相关的知识和编程技术。而 SurfaceView 在一些简单的场景中更易于使用和理解。
总之GLSurfaceView 适用于需要进行复杂图形渲染和动画的场景而 SurfaceView 适用于一般的图像展示和简单的绘制需求。选择哪个类取决于你的具体需求和技术能力。 在 AndroidManifest.xml 文件中添加相机权限 uses-permission android:nameandroid.permission.CAMERA /创建相机预览的布局 RelativeLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.CameraActivityandroid.opengl.GLSurfaceViewandroid:idid/glsurfaceviewandroid:layout_widthmatch_parentandroid:layout_heightmatch_parent /
/RelativeLayout创建相机预览的 Activity用于管理相机预览和 OpenGL 绘制、 package com.test.jnitestimport android.Manifestimport android.content.Contextimport android.content.pm.PackageManagerimport android.graphics.SurfaceTextureimport android.hardware.camera2.CameraCaptureSessionimport android.hardware.camera2.CameraDeviceimport android.hardware.camera2.CameraManagerimport android.hardware.camera2.CaptureRequestimport android.opengl.GLSurfaceViewimport android.os.Bundleimport android.util.Sizeimport android.view.Surfaceimport android.view.WindowManagerimport androidx.appcompat.app.AppCompatActivityimport androidx.core.app.ActivityCompatimport com.test.jnitest.databinding.ActivityCameraBindingimport java.util.*class CameraActivity : AppCompatActivity() {var mGLSurfaceView:GLSurfaceView?nullvar mRenderer:CameraRenderer?nullvar cameraManager:CameraManager?nullvar mCameraDevice:CameraDevice?nullvar mCaptureSession:CameraCaptureSession?nullvar mRequestBuild:CaptureRequest.Builder?nullvar size Size(1920,1080)lateinit var mContext:Contextlateinit var binding:ActivityCameraBindingoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding ActivityCameraBinding.inflate(layoutInflater)setContentView(binding.root)// 设置状态栏透明window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)//设置导航栏透明window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)mContext thismGLSurfaceView binding.glsurfaceviewmGLSurfaceView?.setEGLContextClientVersion(2)// 创建并设置相机渲染器mRenderer CameraRenderer(mGLSurfaceView!!)mGLSurfaceView?.setRenderer(mRenderer)mGLSurfaceView?.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);// 获取摄像头管理器cameraManager getSystemService(Context.CAMERA_SERVICE) as CameraManagerif (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) ! PackageManager.PERMISSION_GRANTED) {this.requestPermissions(mutableListOfString(Manifest.permission.CAMERA).toTypedArray(),200)return}cameraManager?.openCamera(5,mCameraStateCallback,null)}override fun onResume() {super.onResume()mGLSurfaceView?.onResume()}override fun onDestroy() {super.onDestroy()closeCamera()}// 相机状态回调var mCameraStateCallback object : CameraDevice.StateCallback() {override fun onOpened(p0: CameraDevice) {mCameraDevice p0// 创建预览会话var surfaceTexture mRenderer?.mSurfaceTexturesurfaceTexture?.setDefaultBufferSize(size.width,size.height)var surface Surface(surfaceTexture)mRequestBuild mCameraDevice?.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)mRequestBuild?.addTarget(surface)val surfaces Arrays.asList(surface)mCameraDevice?.createCaptureSession(surfaces,mCaptureCallback,null)}override fun onDisconnected(p0: CameraDevice) {p0.close()}override fun onError(p0: CameraDevice, p1: Int) {p0.close()}}// 捕获会话状态回调var mCaptureCallback object : CameraCaptureSession.StateCallback() {override fun onConfigured(p0: CameraCaptureSession) {mCaptureSession p0mRequestBuild?.build()?.let { mCaptureSession?.setRepeatingRequest(it,null,null) }}override fun onConfigureFailed(p0: CameraCaptureSession) {p0.close()mCaptureSession null}}// 关闭相机private fun closeCamera() {mCaptureSession?.close()mCaptureSession nullmCameraDevice?.close()mCameraDevice null}}创建相机渲染器创建一个继承自 GLSurfaceView.Renderer 的类用于实现 OpenGL 绘制和与相机交互的逻辑 package com.test.jnitestimport android.content.Contextimport android.graphics.SurfaceTextureimport android.graphics.SurfaceTexture.OnFrameAvailableListenerimport android.opengl.GLES11Extimport android.opengl.GLES20import android.opengl.GLSurfaceViewimport java.nio.ByteBufferimport java.nio.ByteOrderimport java.nio.FloatBufferimport javax.microedition.khronos.egl.EGLConfigimport javax.microedition.khronos.opengles.GL10class CameraRenderer(var mGLSurfaceView: GLSurfaceView):GLSurfaceView.Renderer,OnFrameAvailableListener {//摄像头图像的纹理IDvar textureId:Int 0var mSurfaceTexture:SurfaceTexture?nullprivate val COORDS_PER_VERTEX 2private val TEXTURE_COORDS_PER_VERTEX 2//顶点着色器var vertexShaderCode attribute vec4 a_position;attribute vec2 a_textureCoord;varying vec2 v_textureCoord;void main() {gl_Position a_position;v_textureCoord a_textureCoord;}// 片段着色器var fragmentShaderCode #extension GL_OES_EGL_image_external : requireprecision mediump float;uniform samplerExternalOES u_texture;varying vec2 v_textureCoord;void main() {gl_FragColor texture2D(u_texture, v_textureCoord);}//顶点坐标数据表示预览图像的位置和大小。private val VERTEX_COORDS floatArrayOf(-1.0f, -1.0f,1.0f, -1.0f,-1.0f, 1.0f,1.0f, 1.0f)//纹理坐标数据表示摄像头图像在预览区域的映射关系。private val TEXTURE_COORDS floatArrayOf(0f, 1f,1f, 1f,0f, 0f,1f, 0f)//着色器程序的IDprivate var programId 0//顶点属性的句柄private var positionHandle 0private var textureCoordHandle 0init {textureId createTexture()mSurfaceTexture SurfaceTexture(textureId)mSurfaceTexture?.setOnFrameAvailableListener(this)}/*** 初始化OpenGL并加载顶点着色器和片段着色器。通过编译和链接着色器创建着色器程序并获取顶点属性的句柄。*/override fun onSurfaceCreated(p0: GL10?, p1: EGLConfig?) {// 在此进行 OpenGL 环境初始化如创建纹理、着色器程序等// 设置清空颜色缓冲区时的颜色值为黑色GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f)// 加载顶点着色器和片段着色器val vertexShader: Int loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode)val fragmentShader: Int loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode)// 创建着色器程序并将顶点着色器和片段着色器绑定到该程序上programId GLES20.glCreateProgram()GLES20.glAttachShader(programId, vertexShader)GLES20.glAttachShader(programId, fragmentShader)// 链接着色器程序并检查是否链接成功GLES20.glLinkProgram(programId)// 获取顶点坐标属性和纹理坐标属性的位置positionHandle GLES20.glGetAttribLocation(programId, a_position)textureCoordHandle GLES20.glGetAttribLocation(programId, a_textureCoord)// 使用着色器程序GLES20.glUseProgram(programId)}override fun onSurfaceChanged(p0: GL10?, p1: Int, p2: Int) {// 在此响应 GLSurfaceView 尺寸变化如更新视口大小等GLES20.glViewport(0, 0, p1, p2);}/*** 绘制每一帧,在此进行实际的绘制操作如清屏、绘制纹理等*/override fun onDrawFrame(p0: GL10?) {// 更新纹理图像mSurfaceTexture?.updateTexImage();// 清空颜色缓冲区GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);// 设置顶点坐标属性并启用GLES20.glVertexAttribPointer(positionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, 0, floatBufferFromArray(VERTEX_COORDS));GLES20.glEnableVertexAttribArray(positionHandle);// 设置纹理坐标属性并启用GLES20.glVertexAttribPointer(textureCoordHandle, TEXTURE_COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, 0, floatBufferFromArray(TEXTURE_COORDS));GLES20.glEnableVertexAttribArray(textureCoordHandle);// 激活纹理单元0并将当前纹理绑定到外部OES纹理目标GLES20.glActiveTexture(GLES20.GL_TEXTURE0);GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textureId);// 绘制三角带的图元GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, VERTEX_COORDS.size / COORDS_PER_VERTEX);}/*** 创建摄像头纹理*/private fun createTexture(): Int {// 创建一个用于存储纹理ID的数组val textureIds IntArray(1)// 生成一个纹理对象并将纹理ID存储到数组中GLES20.glGenTextures(1, textureIds, 0)// 将当前纹理绑定到OpenGL ES的纹理目标外部OES纹理GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textureIds[0])// 设置纹理S轴的包裹模式为GL_CLAMP_TO_EDGE即超出边界的纹理坐标会被截取到边界上的纹素GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE)// 设置纹理T轴的包裹模式为GL_CLAMP_TO_EDGEGLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE)// 设置纹理缩小过滤器为GL_NEAREST即使用最近邻采样的方式进行纹理缩小GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST)// 设置纹理放大过滤器为GL_NEARESTGLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST)return textureIds[0]}/*** 加载着色器,接受着色器类型和着色器代码作为参数并将编译后的着色器对象的ID返回* param type 着色器类型如GLES20.GL_VERTEX_SHADER或GLES20.GL_FRAGMENT_SHADER* param shaderCode 着色器代码* return 着色器的ID*/private fun loadShader(type: Int, shaderCode: String): Int {// 创建一个新的着色器对象val shader GLES20.glCreateShader(type)// 将着色器代码加载到着色器对象中GLES20.glShaderSource(shader, shaderCode)// 编译着色器GLES20.glCompileShader(shader)return shader}private fun floatBufferFromArray(array: FloatArray): FloatBuffer? {val byteBuffer: ByteBuffer ByteBuffer.allocateDirect(array.size * 4)byteBuffer.order(ByteOrder.nativeOrder())val floatBuffer: FloatBuffer byteBuffer.asFloatBuffer()floatBuffer.put(array)floatBuffer.position(0)return floatBuffer}override fun onFrameAvailable(p0: SurfaceTexture?) {// 当相机有新的帧可用时回调可以在这里进行一些处理mGLSurfaceView.requestRender()}}通过以上步骤你可以实现使用 Camera2 API 和 GLSurfaceView 预览相机的功能。在 CameraActivity 中我们通过 Camera2 API 打开相机并创建相机预览会话然后将相机预览的 SurfaceTexture 传递给 CameraRenderer在 CameraRenderer 的 onDrawFrame() 方法中绘制相机预览帧的纹理内容。 文章转载自: http://www.morning.rntyn.cn.gov.cn.rntyn.cn http://www.morning.snrbl.cn.gov.cn.snrbl.cn http://www.morning.dzqyn.cn.gov.cn.dzqyn.cn http://www.morning.glkhx.cn.gov.cn.glkhx.cn http://www.morning.wnnlr.cn.gov.cn.wnnlr.cn http://www.morning.twfdm.cn.gov.cn.twfdm.cn http://www.morning.wxgd.cn.gov.cn.wxgd.cn http://www.morning.gccrn.cn.gov.cn.gccrn.cn http://www.morning.cpnlq.cn.gov.cn.cpnlq.cn http://www.morning.gthwz.cn.gov.cn.gthwz.cn http://www.morning.xlwpz.cn.gov.cn.xlwpz.cn http://www.morning.rcjqgy.com.gov.cn.rcjqgy.com http://www.morning.wnzgm.cn.gov.cn.wnzgm.cn http://www.morning.rqxhp.cn.gov.cn.rqxhp.cn http://www.morning.qyrnp.cn.gov.cn.qyrnp.cn http://www.morning.knscf.cn.gov.cn.knscf.cn http://www.morning.gyzfp.cn.gov.cn.gyzfp.cn http://www.morning.rqkzh.cn.gov.cn.rqkzh.cn http://www.morning.eviap.com.gov.cn.eviap.com http://www.morning.xgchm.cn.gov.cn.xgchm.cn http://www.morning.tstwx.cn.gov.cn.tstwx.cn http://www.morning.hgsylxs.com.gov.cn.hgsylxs.com http://www.morning.tpnxr.cn.gov.cn.tpnxr.cn http://www.morning.lxdbn.cn.gov.cn.lxdbn.cn http://www.morning.sjbty.cn.gov.cn.sjbty.cn http://www.morning.lnckq.cn.gov.cn.lnckq.cn http://www.morning.mqmmc.cn.gov.cn.mqmmc.cn http://www.morning.syqtt.cn.gov.cn.syqtt.cn http://www.morning.rfpq.cn.gov.cn.rfpq.cn http://www.morning.ysdwq.cn.gov.cn.ysdwq.cn http://www.morning.lmzpk.cn.gov.cn.lmzpk.cn http://www.morning.qxltp.cn.gov.cn.qxltp.cn http://www.morning.gmwqd.cn.gov.cn.gmwqd.cn http://www.morning.srsln.cn.gov.cn.srsln.cn http://www.morning.dddcfr.cn.gov.cn.dddcfr.cn http://www.morning.xcnwf.cn.gov.cn.xcnwf.cn http://www.morning.kfcz.cn.gov.cn.kfcz.cn http://www.morning.rmxk.cn.gov.cn.rmxk.cn http://www.morning.ey3h2d.cn.gov.cn.ey3h2d.cn http://www.morning.zqzhd.cn.gov.cn.zqzhd.cn http://www.morning.wmdlp.cn.gov.cn.wmdlp.cn http://www.morning.wtyqs.cn.gov.cn.wtyqs.cn http://www.morning.hxgly.cn.gov.cn.hxgly.cn http://www.morning.pkfpl.cn.gov.cn.pkfpl.cn http://www.morning.zthln.cn.gov.cn.zthln.cn http://www.morning.roymf.cn.gov.cn.roymf.cn http://www.morning.znknj.cn.gov.cn.znknj.cn http://www.morning.wdpt.cn.gov.cn.wdpt.cn http://www.morning.hnrqn.cn.gov.cn.hnrqn.cn http://www.morning.nnwmd.cn.gov.cn.nnwmd.cn http://www.morning.wjhqd.cn.gov.cn.wjhqd.cn http://www.morning.bktzr.cn.gov.cn.bktzr.cn http://www.morning.wynqg.cn.gov.cn.wynqg.cn http://www.morning.pjrql.cn.gov.cn.pjrql.cn http://www.morning.dmsxd.cn.gov.cn.dmsxd.cn http://www.morning.nfbxgtj.com.gov.cn.nfbxgtj.com http://www.morning.zpqlf.cn.gov.cn.zpqlf.cn http://www.morning.zmtrk.cn.gov.cn.zmtrk.cn http://www.morning.fmswb.cn.gov.cn.fmswb.cn http://www.morning.cmrfl.cn.gov.cn.cmrfl.cn http://www.morning.rxtxf.cn.gov.cn.rxtxf.cn http://www.morning.lgpzq.cn.gov.cn.lgpzq.cn http://www.morning.rlbc.cn.gov.cn.rlbc.cn http://www.morning.kghhl.cn.gov.cn.kghhl.cn http://www.morning.dnqliv.cn.gov.cn.dnqliv.cn http://www.morning.lngyd.cn.gov.cn.lngyd.cn http://www.morning.gbkkt.cn.gov.cn.gbkkt.cn http://www.morning.ttdbr.cn.gov.cn.ttdbr.cn http://www.morning.xhqwm.cn.gov.cn.xhqwm.cn http://www.morning.mjmtm.cn.gov.cn.mjmtm.cn http://www.morning.trjr.cn.gov.cn.trjr.cn http://www.morning.rrxgx.cn.gov.cn.rrxgx.cn http://www.morning.bpmtg.cn.gov.cn.bpmtg.cn http://www.morning.fchkc.cn.gov.cn.fchkc.cn http://www.morning.qggxt.cn.gov.cn.qggxt.cn http://www.morning.tfrmx.cn.gov.cn.tfrmx.cn http://www.morning.zdsqb.cn.gov.cn.zdsqb.cn http://www.morning.ybhjs.cn.gov.cn.ybhjs.cn http://www.morning.wyjpt.cn.gov.cn.wyjpt.cn http://www.morning.gbjxj.cn.gov.cn.gbjxj.cn