1

TextureView を使用して、Android アプリケーションで画像キャプチャをプレビューしました。これは問題なく動作しますが、画像がキャプチャされたというユーザー フィードバックを提供しようとしています。画像プレビューを一時的に非表示にしてから、通常のプレビューを再開してそのフィードバックを提供したいと思います。

空の画像を TextureView にプッシュしようとして失敗しました。また、setVisibility() 属性 (INVISIBLE および GONE) を使用して TextureView 自体を一時的に非表示にすることにも失敗しました。この属性には目に見える効果はありません。このフィードバックを他にどのように実装できますか?

4

2 に答える 2

2

ルーカスの答えと同様に、テクスチャ ビューの上に完全な黒のビューもあります。ユーザーがシャッター ボタンを押すと、この黒いビューがフェード インしてからフェード アウトします。このアニメーションは、携帯電話のネイティブ カメラが持つ実際のシャッター効果に近いと思います。

<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
     */
}
于 2020-07-21T18:05:17.547 に答える
1

デフォルトでは非表示で、写真が撮られると 100 ミリ秒表示される、カメラ プレビューとまったく同じ大きさのシンプルなビューを使用してそれを行いました。

camera?.takePicture(shutterCallback, null, takePictureCallback)

private val shutterCallback = Camera.ShutterCallback {
    shutterEffectView.setVisible()
    val handler = Handler()
    val runnable = Runnable { shutterEffectView.setGone() }
    handler.postDelayed(runnable, 100)
}

このコードは kotlin です。古いカメラ API を使用しているため、シャッター コールバックを使用しています。camera2 API では、このコールバックを使用する必要があると思います

于 2016-10-05T12:55:26.267 に答える