我有自定义跨度,应在特定间隔后重复重绘。我尝试调用invalidate
实例的TextView
方法,但没有任何反应。
仅当我append
个新文本TextView
实例时才重绘我的自定义范围。
所以,我的问题是如何在不更改文本的情况下实现TextView
的“强制”重绘/无效?
UPD:
我的自定义范围TypingAnimationSpan
继承自ReplacementSpan
。
在Draw
中的TypingAnimationSpan
方法中,只有一部分文本被绘制到画布上。在下一个Draw
上,图形文字部分的调用长度增加。
结果应达到“打字”效果。
我在AnimatedTextView
方法中进行的自定义Draw
检查-是否有TypingAnimationSpan
处于animation
状态(应重绘)并调用PostInvalidateDelayed
< / p>
TypingAnimationSpan
的一部分:
public override void Draw(Canvas canvas, ICharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint)
{
count += 0.1f * Speed;
count = Math.Min(count, end - start);
canvas.DrawText(text, start, start + (int) count, x, y, paint);
IsAnimationRunning = count <= end - start;
}
public override int GetSize(Paint paint, ICharSequence text, int start, int end, Paint.FontMetricsInt fm)
{
return (int) paint.MeasureText(text, start, start + (int) count);
}
AnimatedTextView
的一部分:
public override void Draw(Canvas canvas)
{
base.Draw(canvas);
var targetSpans = (this.TextFormatted as ISpanned)
?.GetSpans(0, this.TextFormatted.Length(), Java.Lang.Class.FromType(typeof(TypingAnimationSpan)))
?.ToList();
bool needInvalidate = targetSpans?.Any(x => ((TypingAnimationSpan ) x).IsAnimationRunning) == true;
if (needInvalidate)
{
this.PostInvalidateDelayed(1);
}
}
因此,我看到调用了this.PostInvalidateDelayed(1);
,但是没有重绘跨度。