强制重画TextView实例

时间:2019-01-08 16:43:23

标签: java android xamarin

我有自定义跨度,应在特定间隔后重复重绘。我尝试调用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);,但是没有重绘跨度。

0 个答案:

没有答案