【问题标题】:Two different styles in a single textview with different gravity and height具有不同重力和高度的单个文本视图中的两种不同样式
【发布时间】:2013-03-12 08:12:33
【问题描述】:

我正在寻找一个看起来像 的文本视图。我已经使用下面的代码来实现这个..

SpannableString text;
    text = new SpannableString(bal_dollars.getText());
    int index = bal_dollars.getText().toString().indexOf(".");
    text.setSpan(new TextAppearanceSpan(getApplicationContext(),
            R.style.HeroGraphicBalanceSmallFont), index, bal_dollars
            .getText().toString().length(),
            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    bal_dollars.setText(text, TextView.BufferType.SPANNABLE);

这是span中使用的样式..

<style name="HeroGraphicBalanceSmallFont" parent="@android:style/TextAppearance.Medium">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:textSize">50sp</item>
    <item name="android:singleLine">true</item>
    <item name="android:layout_height">match_parent</item>
    <item name="android:layout_gravity">top|right</item>
    <item name="android:paddingBottom">30dp</item>
    <item name="android:gravity">top|right</item>
    <item name="android:textColor">@color/status_text</item>
    <item name="customFont">fonts/HeroicCondensedMedium.ttf</item>
</style>

除了目标文本范围的间距(即小数部分重力)之外,一切看起来都很好。。我尝试了所有的 xml 属性。请帮忙

【问题讨论】:

  • 我会查看TextPaintbaselineShift 属性。
  • 感谢@kcoppock,我已经深入研究了扩展MetricAffectingSpan 类和更改baselineshift 属性。它就像一个魅力:)
  • 晚了 1.5 年.. 但 SuperscriptSpan 不适合这个吗?

标签: android textview android-styles


【解决方案1】:

我破解了它。我发布此内容可能对其他人有帮助,并感谢@kcoppock 的提示。 我扩展了MetricAffectingSpan 类,它以改变字符宽度或高度的方式影响字符级文本格式,扩展了此类。

public class CustomCharacterSpan extends MetricAffectingSpan {
double ratio = 0.5;

public CustomCharacterSpan() {
}

public CustomCharacterSpan(double ratio) {
    this.ratio = ratio;
}

@Override
public void updateDrawState(TextPaint paint) {
    paint.baselineShift += (int) (paint.ascent() * ratio);
}

@Override
public void updateMeasureState(TextPaint paint) {
    paint.baselineShift += (int) (paint.ascent() * ratio);
}}

使用它来更新视图中的文本..

String string = tv.getText().toString();
    SpannableString text = new SpannableString(tv.getText());
    int index = tv.getText().toString().indexOf(".");
    text.setSpan(new CustomCharacterSpan(), index, string.length(),
            SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);//u can use ur own ratio using another constructor
    tv.setText(text, TextView.BufferType.SPANNABLE);

【讨论】:

    猜你喜欢
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 2015-08-24
    • 2019-12-26
    • 2014-11-16
    相关资源
    最近更新 更多