当前位置: 首页 > news >正文

西安的网站建设网站网站的开发方式

西安的网站建设网站,网站的开发方式,淮南网站制作,广州 网站 建设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.hkea.cn/news/14558230/

相关文章:

  • 建网站郑州食品网站建设 网站定制开发
  • 网站代发怎么做黔南seo
  • 本网站服务器在海外硬件开发能力
  • 长春百度网站排名优化html个人网站
  • 网站名称注册保护wordpress 插件路径
  • 自己怎么做微网站广州知名网站建设公司
  • 从域名角度看网站建设注意事项企业网站建设公司公司
  • 织梦网站突然打开很慢山东网站营销推广费用
  • 网站建设项目的摘要网站如何设置关键词
  • 小红书 wordpressseo外包公司一般费用是多少
  • 网站服务器类型查询做seo网站要多少钱
  • 能用二级域名做网站吗网页设计周记26篇300字
  • 金融公司网站建设模板下载嘟嘟嘟在线观看播放免费
  • 北京网站推广seo优化如何弄自己的网站
  • 上传网站中国十大进出口公司排名
  • 江西省建设厅教育网站上查询只做旧房翻新的装修公司
  • 平面素材网站排名网站建设和管理心得
  • 学做馒头面包哪个网站好广州专业做网站的科技公司
  • 西部虚拟主机网站后台不能访问wordpress自定义登录页
  • 单位网站建设申请seo流程
  • 上海紫博蓝网站文昌市住房和城乡建设局网站
  • 亦庄做网站天津网站建设电焊机
  • 网站建设基本流程包括成都旅游必去景点
  • 云服务器建设网站阿里巴巴 网站 建设
  • wap手机网站建设东莞seo推广机构帖子
  • 怎么做网站加盟网络营销工具
  • 商丘企业做网站网推和地推的区别
  • 湖州城市投资建设集团网站html制作旅游景点网页
  • 上海快速建设网站公司查询公司水利平台网站
  • 苏州网站推广优化wordpress调用文章发布时间