使用 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()
}
}
我想知道是否可以在动画中对文本视图的特定行执行淡入淡出 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()
}
}