【问题标题】:How to get the bounds of a text string (with attributes) in Android?如何在Android中获取文本字符串(带有属性)的边界?
【发布时间】:2012-12-18 16:01:28
【问题描述】:

给定资源中的一个字符串,我怎样才能得到它的边界矩形?

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

<string name="foobar"><small>Foo</small>\nBar</string>

换句话说,我正在实现一个自定义视图,它将显示这样的字符串,并且我想计算我的视图的大小。

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

【问题讨论】:

  • 哦,我应该提一下,我已经查看了 TextView 的源代码以寻找提示,但它对我来说有点太复杂了。
  • stackoverflow.com/questions/5033012找到了很多有用的信息

标签: android font-size


【解决方案1】:

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

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

显示和测量html应该遵循TextView的代码,你可以在TextView.onDraw()和TextView.onMeasure()中找到这个,这里我只说测量html的步骤。

  1. 解析 html。使用 Html.fromHtml() 获取跨区文本。
  2. 使用跨区文本创建 StaticLayoutDynamicLayout
  3. 使用Layout.getLineWidth()Layout.getHeight() 测量文本。

【讨论】:

  • 是的,实际上我正在覆盖 TextView。
  • 谢谢;我不熟悉 Layout 类;现在调查他们。
  • 好吧,我只是浪费了一周的时间,因为我太聪明了,对我自己好。我看到 StaticLayout 是从 CharSequence 实例化的,但是我的文本中嵌入了样式信息,包括字体大小更改,所以使用 CharSequence 的东西对我不起作用。最后,我意识到 Spannable 也是一个 CharSequence,从源代码阅读到 StaticLayout,我意识到它对 Spannables 进行了特殊处理。现在我已经掌握了这块拼图,我意识到你已经找到了我的问题的答案。 --谢谢。
【解决方案2】:

试试这个:

字符串.xml

       <string name="foobar"><small>Foo</small>\nBar</string>

活动中

       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));
           }
       });

它将在可见屏幕区域显示 TextView 使用的必需属性。

希望对你有帮助。

谢谢。

【讨论】:

  • 谢谢;我会玩的。
  • @EdwardFalk 确定。让我知道是否需要我进一步的需求。
  • @EdwardFalk 你有机会玩这个吗?对你有帮助吗?
  • 还没有;我已经放假了。不过今晚可能会玩它。
猜你喜欢
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
  • 2013-10-31
相关资源
最近更新 更多