史上最全SurfaceView使用讲解

Posted super码王

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了史上最全SurfaceView使用讲解相关的知识,希望对你有一定的参考价值。

SurfaceView 与 View 的区别

1、View主要适用于主动更新的情况下,而SurfaceView主要适用于被动更新,例如频繁地刷新。
2、View 在主线程中对画面进行刷新,而 SurfaceView 通常会通过一个子线程来进行页面的刷新。
3、View 在绘图时没有使用双缓冲机制,而 SurfaceView 在底层实现机制中就已经实现了双缓冲机制

总结,如果需要频繁刷新,或者刷新时数据处理量比较大,那么可以考虑使用 SurfaceView 。

SurfaceView的使用

方式一:直接使用 SurfaceView

  • xml布局文件
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <SurfaceView
        android:id="@+id/sfv_draw"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
  • kotlin逻辑文件
package com.example.study01

import android.graphics.Color
import android.graphics.Paint
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.SurfaceHolder
import android.view.SurfaceView

class MainActivity : AppCompatActivity(), SurfaceHolder.Callback 

    private val sfv_draw by lazy  findViewById<SurfaceView>(R.id.sfv_draw) 

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        sfv_draw.holder.addCallback(this)
    

    override fun surfaceCreated(p0: SurfaceHolder) 
        val mPaint = Paint()
        mPaint.color = Color.WHITE
        mPaint.isDither = true
        mPaint.isAntiAlias = true
        mPaint.style = Paint.Style.FILL_AND_STROKE
        val mCanvas = p0.lockCanvas()
        mCanvas.drawRect(0F, 0F, 100F, 100F, mPaint)
        p0.unlockCanvasAndPost(mCanvas)
    

    override fun surfaceChanged(p0: SurfaceHolder, p1: Int, p2: Int, p3: Int) 
        println("我被执行了 surfaceChanged")
    

    override fun surfaceDestroyed(p0: SurfaceHolder) 
        println("我被执行了 surfaceDestroyed")
    

1、通过 SurfaceHolder 添加  SurfaceHolder.Callback 回调

2、通过 SurfaceHolder.lockCanvas() 获得一个Canvas对象用于绘制。

3、通过 SurfaceHolder.unlockCanvasAndPost() 方法传入Canvas对象完成更新。

方式二:继承 SurfaceView 实现自定义View

  • xml布局文件
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.example.study01.MySurfaceView
        android:id="@+id/sfv_draw"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
  • kotlin逻辑代码
package com.example.study01

import android.content.Context
import android.graphics.Color
import android.graphics.Paint
import android.util.AttributeSet
import android.view.SurfaceHolder
import android.view.SurfaceView

class MySurfaceView(context: Context, attrs: AttributeSet?, defStyleAttr: Int) :
    SurfaceView(context, attrs, defStyleAttr), SurfaceHolder.Callback 

    constructor(context: Context, attrs: AttributeSet) : this(context, attrs, 0)
    constructor(context: Context) : this(context, null, 0)

    init 
        holder.addCallback(this)
    

    override fun surfaceCreated(p0: SurfaceHolder) 
        val mPaint = Paint()
        mPaint.color = Color.WHITE
        mPaint.isDither = true
        mPaint.isAntiAlias = true
        mPaint.style = Paint.Style.FILL_AND_STROKE
        val mCanvas = p0.lockCanvas()
        mCanvas.drawRect(0F, 0F, 100F, 100F, mPaint)
        p0.unlockCanvasAndPost(mCanvas)
    

    override fun surfaceChanged(p0: SurfaceHolder, p1: Int, p2: Int, p3: Int) 
        println("我被执行了 surfaceChanged")
    

    override fun surfaceDestroyed(p0: SurfaceHolder) 
        println("我被执行了 surfaceDestroyed")
    

以上是关于史上最全SurfaceView使用讲解的主要内容,如果未能解决你的问题,请参考以下文章

史上最全SurfaceView使用讲解

Python程序打包成.exe(史上最全面讲解)

史上最全Android渲染机制讲解(长文源码深度剖析)

史上最全的英语音标发音拼读规则教程(视频讲解)

Python程序打包成.exe(史上最全面讲解)

Linux环境变量史上最全版讲解