ルーカスの答えと同様に、テクスチャ ビューの上に完全な黒のビューもあります。ユーザーがシャッター ボタンを押すと、この黒いビューがフェード インしてからフェード アウトします。このアニメーションは、携帯電話のネイティブ カメラが持つ実際のシャッター効果に近いと思います。
<TextureView
android:id="@+id/view_finder"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<View
android:id="@+id/camera_overlay"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@color/black"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
view.captureButton.setOnClickListener {
val fadeOutAnimation = AlphaAnimation(1.0f, 0.0f).apply {
duration = 250
setAnimationListener(object : Animation.AnimationListener {
override fun onAnimationRepeat(animation: Animation?) {
}
override fun onAnimationEnd(animation: Animation?) {
view.captureOverlay.alpha = 0.0f
view.captureOverlay.isVisible = false
}
override fun onAnimationStart(animation: Animation?) {
}
})
}
val fadeInAnimation = AlphaAnimation(0.0f, 1.0f).apply {
duration = 20
setAnimationListener(object : Animation.AnimationListener {
override fun onAnimationRepeat(animation: Animation?) {
}
override fun onAnimationEnd(animation: Animation?) {
view.captureOverlay.alpha = 1.0f
Handler(Looper.getMainLooper()).postDelayed({
view.captureOverlay.startAnimation(fadeOutAnimation)
}, 20)
}
override fun onAnimationStart(animation: Animation?) {
view.captureOverlay.isVisible = true
}
})
}
view.captureOverlay.startAnimation(fadeInAnimation)
/**
* Capture image here
*/
}