如何在Android中获取文本字符串(带有属性)的边界?

如何在Android中获取文本字符串(带有属性)的边界?,android,font-size,Android,Font Size,在参考资料中给定一个字符串,如何获取它的边框 对于纯文本,我可以使用Paint.getTextBounds(),但这是一个来自资源的字符串,其中包含换行符和属性设置 <string name="foobar"><small>Foo</small>\nBar</string> Foo\nBar 换句话说,我正在实现一个自定义视图,它将显示这样的字符串,我想计算视图的大小 更多细节:基本上,我正在实现一个TextView的变体,它可以调整字体大小以

在参考资料中给定一个字符串,如何获取它的边框

对于纯文本,我可以使用Paint.getTextBounds(),但这是一个来自资源的字符串,其中包含换行符和属性设置

<string name="foobar"><small>Foo</small>\nBar</string>
Foo\nBar
换句话说,我正在实现一个自定义视图,它将显示这样的字符串,我想计算视图的大小

更多细节:基本上,我正在实现一个TextView的变体,它可以调整字体大小以适应可用空间,而不是调整大小以适应文本。

尝试以下方法:

String.xml

       <string name="foobar"><small>Foo</small>\nBar</string>
它将在可见屏幕区域显示TextView使用的必需属性

希望对你有帮助


谢谢。

您想在自定义视图中显示html。我说得清楚吗

如果您想通过自己的代码实现这一切。这是一项非常庞大的工作。扩展TextView并重写某些方法是最好的选择,但是如果您坚持编写自己的类,您仍然可以从某些系统类获得帮助

显示和测量html应该遵循TextView的代码,您可以在TextView.onDraw()和TextView.onMeasure()中找到这一点,这里我只讨论测量html的步骤

  • 解析html。使用
    Html.fromHtml()
  • 使用跨距文本创建一个
    StaticLayout
    DynamicLayout
  • 使用
    Layout.getLineWidth()
    Layout.getHeight()
    测量文本

  • 哦,我应该提到,我已经查看了TextView的源代码以寻找提示,但这对我来说有点太复杂了。在上找到了很多有用的信息是的,实际上我正在覆盖TextView。谢谢;我不熟悉布局类;现在就去调查一下。我只是浪费了一个星期的时间,因为我太聪明了。我看到StaticLayout是从CharSequence实例化的,但是我的文本中嵌入了样式信息,包括字体大小的更改,所以使用CharSequence的东西对我来说不起作用。最后,我意识到Spanable也是一个字符序列,从读取源代码到StaticLayout,我意识到它对Spanable进行了特殊处理。现在我有了那块拼图,我意识到你已经找到了我问题的答案--谢谢,谢谢,;“我会玩的。”爱德华福尔克:好的,当然。如果我还有什么需要,请告诉我。@EdwardFalk你有机会玩这个吗。它对你有帮助吗?还没有;我去度假了。不过今晚可能会玩。
           final TextView mytext = (TextView) findViewById(R.id.my_textView);
           mytext.setText(getString(R.string.foobar));
    
           Button btn_getTextBounds = (Button) findViewById(R.id.ok);
           btn_getTextBounds.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View v) {
                   Rect rectf = new Rect();
                   mytext.getLocalVisibleRect(rectf);
    
                   Log.d("WIDTH        :",String.valueOf(rectf.width()));
                   Log.d("HEIGHT       :",String.valueOf(rectf.height()));
                   Log.d("left         :",String.valueOf(rectf.left));
                   Log.d("right        :",String.valueOf(rectf.right));
                   Log.d("top          :",String.valueOf(rectf.top));
                   Log.d("bottom       :",String.valueOf(rectf.bottom));
               }
           });