在字符级别更改EditText中的行距/行高

时间:2015-07-28 18:29:23

标签: android android-layout android-edittext spannablestring

我在EditText的开头和结尾都实现了粗体,大,不可编辑的“智能引号”:

enter image description here

引号是文本中不可选择的部分,我在其中设置RelativeSizeSpan(2f)。结果几乎是我想要的。

s.setSpan(spanLeft, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
s.setSpan(spanRight, s.length() - 1, s.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

但是,您可以看到更大的字体会导致更大的高度影响整条线。这在第一行上是不相关的,但在最后一行令人不快。我想知道这两个字符是否可以保持字体大小但是降低行高。

enter image description here

我想减少前导部分,以便第一行和最后一行与段落的其余部分具有一致的高度。我最高的愿望是将报价转化为基线,同时保持其外观。

你有什么建议吗?这可能是通过某些Span来实现的吗?我应该放弃吗?你看到了解决方法吗?

我看到我可以使用引号创建两个png并使用ImageSpan(虽然我从未使用它并且不知道它会如何工作),但它对我来说很烦人(我不是真的进入图形)。

2 个答案:

答案 0 :(得分:0)

我在我的一个应用程序中创建了一个类似的效果,其中我有一个跨度使跨区文本变小,并使其坚持主文本的x高度,离开基线。我创建了一个扩展MetricAffectingSpan并实现基线转换的自定义范围。我使用Android SDK中的SuperscriptSpan.java作为示例。

在这种情况下的想法是,你下拉大端报价的基线,使总线高更低。我不是百分百肯定这会有用,因为我不知道如何聪明"线高计算是。

如果有效,请务必在多个屏幕密度上进行测试。我必须在那里某处float拟合int,这引入了一个舍入误差,在我们必须纠正它的某些密度上是如此明显。

答案 1 :(得分:0)

我相信您必须实现自定义Span,只需将updateMeasureState留空:)使用

import android.text.TextPaint;
import android.text.style.MetricAffectingSpan;

public class TestSubScriptSpan extends MetricAffectingSpan {

    private final float mProportion;

    public TestSubScriptSpan(float proportion) {
        mProportion = proportion;
    }

    @Override
    public void updateMeasureState(TextPaint p) {
        // DO NOTHING!
    }

    @Override
    public void updateDrawState(TextPaint tp) {
        tp.setTextSize(tp.getTextSize() * mProportion);
        tp.baselineShift -= (int) (tp.ascent() / 2);
    }
}

然后

TestSubScriptSpan tss = new TestSubScriptSpan(2.0f);
s.setSpan(tss, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
s.setSpan(tss, s.length() - 1, s.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

注意你在updateDrawState()中所做的事情的顺序,因为它很重要。