android - TextView.onDraw 导致死循环

标签 android

我想要一个调整字体大小的 TextView,以便 View 中的文本自动扩展(或收缩)以填充 View 的整个宽度。我想我可以通过创建一个自定义的 TextView 来做到这一点,它覆盖 onDraw() 如下:

public class MaximisedTextView extends TextView {
    // (calls to super constructors here...)

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        TextPaint textPaint = this.getPaint();
        Rect bounds = new Rect();

        String text = (String)this.getText(); // current text in view
        float textSize = this.getTextSize();  // current font size
        int viewWidth = this.getWidth() - this.getPaddingLeft() - this.getPaddingRight();
        textPaint.getTextBounds(text, 0, text.length(), bounds);
        int textWidth = bounds.width();

        // reset font size to make text fill full width of this view
        this.setTextSize(textSize * viewWidth/textWidth);
    }
}

但是,这会使应用程序陷入无限循环(文本大小每次都会略微增大和缩小!),所以我显然采用了错误的方式。对 setTextSize() 的调用是否会触发无效,以便无休止地再次调用 onDraw?

有什么方法可以阻止递归调用(如果发生这种情况)?还是我应该以完全不同的方式进行处理?

最佳答案

Does the call to setTextSize() trigger an invalidate so that onDraw is called again, endlessly?

是的,这可能就是正在发生的事情。如果你take a look of the source code setTextSize 你会看到它会调用这个方法:

private void setRawTextSize(float size) {
    if (size != mTextPaint.getTextSize()) {
        mTextPaint.setTextSize(size);

        if (mLayout != null) {
            nullLayouts();
            requestLayout();
            invalidate(); // yeahh... invalidate XD
        }
    }
}

所以,如果您正在努力覆盖 onDraw 方法,为什么不直接使用一些 drawText 呢? Canvas 的方法类(class)?

关于android - TextView.onDraw 导致死循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3207414/

相关文章:

android - 构建 google breakpad android 示例错误

android - 为 Android 操作系统调试 native 库

android - 在表面 View 中授予权限后相机未打开

Android API 和 CPU 架构

android - DialogFragment 中带有 LinearLayouts 的 ListView 不包装内容

android - 相对布局匹配父级和最大宽度

android - 连接到 LocalServerSocket 时出现 EMFILE(打开的文件过多)错误?

android - 如何在 Android 应用程序中使用 AdMob 广告中介?

java - 具有嵌套值的 JSON 到 POJO

android - 扩展应用程序以全局共享变量