diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/AnswerFeedbackView.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/AnswerFeedbackView.kt
index 6157bf0d3491..28ef39558d68 100644
--- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/AnswerFeedbackView.kt
+++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/AnswerFeedbackView.kt
@@ -19,7 +19,6 @@ import android.content.Context
import android.os.Handler
import android.os.Looper
import android.util.AttributeSet
-import android.view.animation.Animation
import android.view.animation.AnimationUtils
import androidx.appcompat.widget.AppCompatImageView
import com.ichi2.anki.R
@@ -36,11 +35,12 @@ class AnswerFeedbackView : AppCompatImageView {
private val handler = Handler(Looper.getMainLooper())
/**
- * Shows the feedback for one second
- * with a quick fade in, brief hold, then gentle fade out.
+ * Shows the feedback with a quick fade in, brief hold, then gentle fade out.
+ * uses ViewPropertyAnimator instead of legacy AlphaAnimation to avoid compositing
+ * artifacts with WebView backdrop-filter when Frame style "Box" removes card elevation.
*/
fun toggle() {
- clearAnimation()
+ animate().cancel()
fadeOutRunnable?.let {
handler.removeCallbacks(it)
@@ -59,39 +59,25 @@ class AnswerFeedbackView : AppCompatImageView {
return
}
- val fadeIn = AnimationUtils.loadAnimation(context, R.anim.answer_feedback_fade_in)
- val fadeOut = AnimationUtils.loadAnimation(context, R.anim.answer_feedback_fade_out)
+ alpha = 0f
+ visibility = VISIBLE
- fadeIn.setAnimationListener(
- object : Animation.AnimationListener {
- override fun onAnimationStart(animation: Animation) {
- visibility = VISIBLE
- }
-
- override fun onAnimationEnd(animation: Animation) {
- fadeOutRunnable =
- Runnable {
- startAnimation(fadeOut)
- }.also {
- handler.postDelayed(it, 400)
- }
- }
-
- override fun onAnimationRepeat(animation: Animation) {}
- },
- )
- fadeOut.setAnimationListener(
- object : Animation.AnimationListener {
- override fun onAnimationStart(animation: Animation) {}
-
- override fun onAnimationEnd(animation: Animation) {
- visibility = GONE
- fadeOutRunnable = null
- }
-
- override fun onAnimationRepeat(animation: Animation) {}
- },
- )
- startAnimation(fadeIn)
+ animate()
+ .alpha(1f)
+ .setDuration(150)
+ .setInterpolator(AnimationUtils.loadInterpolator(context, android.R.interpolator.fast_out_slow_in))
+ .withEndAction {
+ fadeOutRunnable =
+ Runnable {
+ animate()
+ .alpha(0f)
+ .setDuration(250)
+ .setInterpolator(AnimationUtils.loadInterpolator(context, android.R.interpolator.fast_out_linear_in))
+ .withEndAction {
+ visibility = GONE
+ fadeOutRunnable = null
+ }.start()
+ }.also { handler.postDelayed(it, 400.milliseconds) }
+ }.start()
}
}
diff --git a/AnkiDroid/src/main/res/anim/answer_feedback_fade_in.xml b/AnkiDroid/src/main/res/anim/answer_feedback_fade_in.xml
deleted file mode 100644
index 88d00e31589a..000000000000
--- a/AnkiDroid/src/main/res/anim/answer_feedback_fade_in.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
\ No newline at end of file
diff --git a/AnkiDroid/src/main/res/anim/answer_feedback_fade_out.xml b/AnkiDroid/src/main/res/anim/answer_feedback_fade_out.xml
deleted file mode 100644
index c1a6d744c466..000000000000
--- a/AnkiDroid/src/main/res/anim/answer_feedback_fade_out.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
\ No newline at end of file