【问题标题】:Android layout performance with styled text带有样式文本的 Android 布局性能
【发布时间】:2012-06-01 14:57:04
【问题描述】:

当谈到 Android 中的布局性能时,我在决定走哪条路线时遇到问题。我有一个相当大的布局,需要使用来自 API 的文本进行填充。现在的问题是字幕必须是粗体。为了简化,它看起来像这样。

标题 1: Lorem ipsum...
标题 2: Lorem ipsum...
标题 3: Lorem ipsum...
等等。

在我看来,我有 2 个选择。要么我去 2 个视图来完成这个,比如

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Caption 1"
                android:textStyle="bold" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Lorem ipsum..." />

         </LinearLayout>

或者我选择一个 TextView 并使用

Html.fromHtml("<b>Caption 1</b> Lorem ipsum")

我想知道有人对这两种方法的性能有任何数字。考虑到我必须展示的大视图,很高兴知道。感觉选项 2 更好,但我没有任何证据,我也没有时间测试它们。

干杯!

编辑:我忘了提到我对 API 也有一些控制权,所以我可以在 API 中嵌入 HTML 并以

的形式发回字符串
"<b>Caption</b> Lorem ipsum...". 

从最初的两个答案来看,第一种方法是不可能的。

【问题讨论】:

  • 您可以修改 API,但如果将来您希望它是斜体而不是粗体怎么办?然后你必须再次修改 API。如果某些响应需要根据运行时收集的信息与其他响应不同怎么办?如果您需要设置样式的已知模式“Caption ():”,我建议在代码中处理它会更安全、更简洁。

标签: android performance android-layout


【解决方案1】:

如果您真的想要更快的性能,我建议您使用SpannableStringBuilder 而不是Html.fromHtml

Html.fromHtml 实际上在它的实现中使用了SpannableStringBuilder,但是考虑到,fromHtml 也需要时间来实际解析你的 html 字符串(并加上你需要在 html 标签中包装文本的时间)它会执行得更慢比SpannableStringBuilder

这些变体中的任何一个都将比从 xmls 填充和维护视图更快

附:我什至有一篇关于SpannableStringBuilder 的小文章让你开始:http://illusionsandroid.blogspot.com/2011/05/modifying-coloring-scaling-part-of-text.html

【讨论】:

  • 是的,我也确实看过,但是由于 API 中所有内容的长度各不相同,这让我在使用时有些犹豫,因为我必须指定每个范围。编辑:我对 API 也有(一些)控制权,因此我可以让它返回正确格式的字符串,其中 HTML 已经嵌入
【解决方案2】:

String myCaption = "Caption 1: Lorem Ipsum...";
TextView tv = (TextView)findViewById(R.id.mytextview);

//Set a Regex pattern to find instances of "Caption X:" 
//where X is any integer.
Pattern pattern = Pattern.compile("Caption [0-9]+:");

//Get a matcher for the caption string and find the first instance
Matcher matcher = pattern.matcher(myCaption);
matcher.find();

//These are the start and ending indexes of the discovered pattern
int startIndex = matcher.start();
int endIndex = matcher.end();

//Sets a BOLD span on the
Spannable textSpan = new Spannable(myCaption);
textSpan.setSpan(new StyleSpan(Typeface.BOLD), 
    startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

//Set this Spannable as the TextView text
tv.setText(textSpan);

我还没有对此进行测试,但这个想法应该会让你继续前进,即使这不起作用,因为它是逐字记录的。基本上,使用正则表达式查找字符串的“Caption X:”部分,获取开始和结束索引,并在该特定文本部分设置粗体跨度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 2019-06-10
    • 2013-12-25
    • 2013-09-23
    相关资源
    最近更新 更多