使用 android 动画对文本视图的特定行进行动画处理

Animating a specific line of a textview using android Animations

我想知道是否可以在动画中对文本视图的特定行执行淡入淡出 out/fade。我有一个 two line textview ,我希望“标题”在“数据”淡出和变化时保持可见。我试图限制我的片段的视图数量,因此将两行分成单独的文本视图是不可取的。我对动画还很陌生,不确定这是否可行。

更新

在 Cheticamps 回答后,我开发了我自己的 java 版本的他的解决方案,如果有人正在寻找这个,我想 post 在这里。

    ValueAnimator alphaAnim = ValueAnimator.ofInt(255,0).setDuration(1000);
        alphaAnim.addUpdateListener(valueAnimator -> {
            int alpha = (int) valueAnimator.getAnimatedValue();
            int newColor = binding.ForegroundSpanText.getCurrentTextColor() & 0x00ffff | (alpha <<24);
            System.out.println("Color: "+ Integer.toHexString(newColor));
            SpannableString tempStringHolder = binding.getAnimString();
            if(fadingSpan !=null){
                tempStringHolder.removeSpan(fadingSpan);
            }
            fadingSpan = new ForegroundColorSpan(newColor);
            tempStringHolder.setSpan(fadingSpan, 38, animStringHolder.length(), SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
            binding.setAnimString(tempStringHolder);
        });
        alphaAnim.addListener(new AnimatorListenerAdapter(){
            @Override
            public void onAnimationEnd(Animator animation){
                System.out.println("Finished");
            }
        });

您可以在要淡入淡出的文本部分设置一系列ForegroundColorSpans。每个连续的 ForegroundColorSpan 都会降低文本颜色的 alpha,直到 alpha 值为零。 (Alpha == 255 完全可见;alpha == 0 不可见。)

ForegroundColorSpan 关联的文本颜色的 alpha 值的动画可以用 ValueAnimator 完成。下面展示了这种技术。

TextViw 很简单

<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:bufferType="spannable"
    android:gravity="center"
    android:text="Hello\nWorld!"
    android:textColor="@android:color/black"
    android:textSize="48sp"/>

为了演示目的,代码被包装在按钮的点击侦听器中:

var fadingSpan: ForegroundColorSpan? = null
val spannable = binding.textView.text as Spannable
binding.button.setOnClickListener {
    // android:bufferType="spannable" must be set on the TextView for the following to work.
    // Alpha value varies from the 255 to zero. (We are assuming the starting alpha is 255.)
    ValueAnimator.ofInt(255, 0).apply {
        duration = 3000 // 3 seconds to fade
        // Update listener is called for every tick of the animation.
        addUpdateListener { updatedAnimation ->
            // Get the new alpha value and incorporate it into the color int (AARRGGBB)
            val newAlpha = updatedAnimation.animatedValue as Int
            val newColor =
                binding.textView.currentTextColor and 0x00ffff or (newAlpha shl 24)
            if (fadingSpan != null) {
                spannable.removeSpan(fadingSpan)
            }
            fadingSpan = ForegroundColorSpan(newColor)
            spannable.setSpan(
                fadingSpan,
                6,
                12,
                SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE
            )
        }
        start()
    }
}