我在EditText的开头和结尾都实现了粗体,大,不可编辑的“智能引号”:
引号是文本中不可选择的部分,我在其中设置RelativeSizeSpan(2f)
。结果几乎是我想要的。
s.setSpan(spanLeft, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
s.setSpan(spanRight, s.length() - 1, s.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
但是,您可以看到更大的字体会导致更大的高度影响整条线。这在第一行上是不相关的,但在最后一行令人不快。我想知道这两个字符是否可以保持字体大小但是降低行高。
我想减少前导部分,以便第一行和最后一行与段落的其余部分具有一致的高度。我最高的愿望是将报价转化为基线,同时保持其外观。
你有什么建议吗?这可能是通过某些Span
来实现的吗?我应该放弃吗?你看到了解决方法吗?
我看到我可以使用引号创建两个png并使用ImageSpan
(虽然我从未使用它并且不知道它会如何工作),但它对我来说很烦人(我不是真的进入图形)。
答案 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()中所做的事情的顺序,因为它很重要。