在使用TextureView做为自定义view时,想要手动控制TextureView的销毁和创建
但是发现将Visibility设为View.GONE不会调用onSurfaceTextureDestroyed回调
测试代码如下:
class TestTextureView : TextureView, TextureView.SurfaceTextureListener {
private val TAG = TestTextureView::class.java.simpleName
constructor(context: Context) : super(context)
constructor(context: Context, attributeSet: AttributeSet? = null) : super(context, attributeSet)
constructor(context: Context, attributeSet: AttributeSet? = null, defStyleAttr: Int = 0)
: super(context, attributeSet, defStyleAttr)
init {
//设置背景透明,记住这里是[是否不透明]
isOpaque = false
//设置监听
surfaceTextureListener = this
}
override fun onSurfaceTextureAvailable(surface: SurfaceTexture, width: Int, height: Int) {
Log.i(TAG, "onSurfaceTextureAvailable: ")
}
override fun onSurfaceTextureSizeChanged(surface: SurfaceTexture, width: Int, height: Int) {
Log.i(TAG, "onSurfaceTextureSizeChanged: ")
}
override fun onSurfaceTextureDestroyed(surface: SurfaceTexture): Boolean {
Log.i(TAG, "onSurfaceTextureDestroyed: ")
return true
}
override fun onSurfaceTextureUpdated(surface: SurfaceTexture) {
// Log.i(TAG, "onSurfaceTextureUpdated: ")
}
}
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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.gavinandre.myapplication.TestTextureView
android:id="@+id/test_texture_view"
android:layout_width="0dp"
android:layout_height="0dp"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/visible"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/gone"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.976" />
<Button
android:id="@+id/gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="gone"
app:layout_constraintBottom_toBottomOf="@+id/visible"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/visible"
app:layout_constraintTop_toTopOf="@+id/visible" />
</android.support.constraint.ConstraintLayout>
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
initView()
}
private fun initView() {
visible.setOnClickListener {
test_texture_view?.visibility = View.VISIBLE
}
gone.setOnClickListener {
test_texture_view?.visibility = View.GONE
}
}
override fun onResume() {
super.onResume()
test_texture_view?.visibility = View.VISIBLE
}
override fun onPause() {
super.onPause()
test_texture_view?.visibility = View.GONE
}
}
测试结果发现,无论是在onResume/onPause回调中,还是使用button手动点击,都无法通过更改Visibility来销毁或创建TestTextureView
因此想要手动来销毁创建TextureView的话,需要换一种方式解决:在上级view中添加或移除TextureView
代码更改如下:
class MainActivity : AppCompatActivity() {
private lateinit var parentLayout: ViewGroup
private var testTextureView: TestTextureView? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
initView()
}
private fun initView() {
testTextureView = findViewById<TestTextureView>(R.id.test_texture_view)?.apply {
visibility = View.VISIBLE
parentLayout = parent as ViewGroup
}
visible.setOnClickListener {
// testTextureView?.visibility = View.VISIBLE
addFaceTrackingView()
}
gone.setOnClickListener {
// testTextureView?.visibility = View.GONE
removeFaceTrackingView()
}
}
override fun onResume() {
super.onResume()
// testTextureView?.visibility = View.VISIBLE
addFaceTrackingView()
}
override fun onPause() {
super.onPause()
// testTextureView?.visibility = View.GONE
removeFaceTrackingView()
}
private fun addFaceTrackingView() {
if (testTextureView == null) {
testTextureView = TestTextureView(this).apply {
parentLayout.addView(this)
}
}
}
private fun removeFaceTrackingView() {
if (testTextureView != null) {
parentLayout.removeView(testTextureView)
testTextureView = null
}
}
}
这样就能手动去销毁创建TextureView了