XML文件
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.myapplication.EGLSurfaceView
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ImageView
android:id="@+id/image"
android:layout_marginTop="10dp"
android:layout_marginStart="10dp"
android:layout_width="200dp"
android:layout_height="200dp"
android:background="@drawable/ic_launcher_background" />
</FrameLayout>
Activity代码
private lateinit var mImage : ImageView
class MainActivity8 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main8)
mImage = findViewById<ImageView>(R.id.image)
}
}
SurfaceView代码
class EGLSurfaceView(context: Context, attrs: AttributeSet? = null) : SurfaceView(context, attrs) {
private val renderer = EGLRenderer(context)
init {
holder.addCallback(renderer.surfaceCallback)
}
fun setRenderStrategy(strategy: RenderStrategy) {
renderer.setRenderStrategy(strategy)
}
}
渲染器代码
class EGLRenderer(context: Context) {
private val strategy: RenderStrategy = MyRenderStrategy(context)
private val engine: EGLRenderEngine = EGLRenderEngine(strategy)
fun setRenderStrategy(strategy: RenderStrategy) {
}
val surfaceCallback = object : SurfaceHolder.Callback {
override fun surfaceCreated(holder: SurfaceHolder) {
engine.onSurfaceCreated(holder.surface)
}
override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {
engine.onSurfaceChanged(width, height)
}
override fun surfaceDestroyed(holder: SurfaceHolder) {
engine.onSurfaceDestroyed()
}
}
}
渲染引擎代码
class EGLRenderEngine(private val strategy: RenderStrategy) {
private var mEGLEnvironment: EGLEnvironment? = null
private var mRenderThread: RenderThread? = null
fun onSurfaceCreated(surface: Surface) {
mRenderThread = RenderThread(surface, strategy).apply {
start()
}
}
fun onSurfaceChanged(width: Int, height: Int) {
mRenderThread?.updateSize(width, height)
}
fun onSurfaceDestroyed() {
mRenderThread?.shutdown()
mRenderThread = null
}
private inner class RenderThread(
private val surface: Surface,
private val strategy: RenderStrategy
) : Thread() {
@Volatile private var running = true
@Volatile private var sizeChanged = false
private var width = 0
private var height = 0
fun updateSize(width: Int, height: Int) {
this.width = width
this.height = height
sizeChanged = true
}
fun shutdown() {
running = false
interrupt()
strategy.onSurfaceDestroyed()
mEGLEnvironment?.release()
}
override fun run() {
try {
mEGLEnvironment = EGLEnvironmentBuilder().build(surface)
strategy.onSurfaceCreated()
while (running) {
if (sizeChanged) {
strategy.onSurfaceChanged(width, height)
sizeChanged = false
}
strategy.onDrawFrame()
mEGLEnvironment?.swapBuffers()
}
} catch (e: Exception) {
Log.e("RenderEngine", "Render thread error: ${
e.message}")
}
}
}
}
自定义渲染策略代码
interface RenderStrategy {
fun onSurfaceCreated()
fun onSurfaceChanged(width: Int, height: Int)
fun onDrawFrame()
fun onSurfaceDestroyed()
}
class MyRenderStrategy(private val context: Context) : RenderStrategy {
var mDrawData: MyDrawData2? = null
override fun onSurfaceCreated() {
GLES30.glClearColor(0.0f, 0.5f, 0.5f, 1.0f)
mDrawData = MyDrawData2().apply {
initTexture0(context, R.drawable.picture)
initShaderProgram()
initVertexBuffer()
}
}
override fun onSurfaceChanged(width: Int, height: Int) {
GLES30.glViewport(0, 0, width, height)
mDrawData?.setSurfaceSize(width, height)
}
override fun onDrawFrame() {
GLES30.glEnable(GLES30.GL_DEPTH_TEST)
GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT or GLES30.GL_DEPTH_BUFFER_BIT)
mDrawData?.drawCurrentOutput()
}
override fun onSurfaceDestroyed() {
mDrawData?.release()
}
}
搭建EGL环境代码
class EGLEnvironmentBuilder(private val factory: EGLComponentFactory = DefaultEGLFactory()) {
private lateinit var mEGL: EGL10
private lateinit var mEGLDisplay: EGLDisplay
private lateinit var mEGLConfig: EGLConfig
private lateinit var mEGLContext: EGLContext
private lateinit