4

Я реализовал смелые, большие, нередактируемые «умные кавычки» в начале и в конце моего EditText:Изменения высота ведущей/линия в 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 (хотя я никогда не использовал его и не знал, как это будет работать), но это меня раздражает (я не совсем в графике) ,

ответ

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(), так как это важно.

+0

Хороший человек! Спасибо! – natario

+0

Это решение имеет некоторые проблемы с горизонтальным измерением. Бывает, что последний персонаж обрезается, потому что он больше, чем полагает он. Чтобы этого избежать, вы должны поместить 'tp.setTextScaleX (mProportion)' в 'updateMeasureState'. – natario

0

Я создал аналогичный эффект в одном из моих приложений, где у меня был промежуток, который уменьшил натянутый текст и заставил его придерживаться x-height основного текста, начиная с базовой линии. Я создал специальный диапазон, который расширяет MetricAffectingSpan и реализует сдвиг базовой линии. В качестве примера я использовал SuperscriptSpan.java из Android SDK.

Идея в этом случае заключается в том, что вы вытаскиваете базовую линию цитаты большого конца, чтобы сделать итоговое линейное излучение ниже. Я не уверен на 100%, что это сработает, потому что я не знаю, как «умный» расчет высоты линии.

Если это работает, обязательно проверьте его на нескольких плотностях экрана. Я должен был сделать float подходящим int где-то там, где была введена ошибка округления, которая была настолько заметна на некоторых плотностях, которые нам приходилось исправлять.

+0

Благодарим вас за ответ. Я новичок в текстовых показателях и чувствую себя немного потерянным; для начала я просто попытался использовать SuperscriptSpan с той лишь разницей, что я даю 'tp.baselineShift' твердое значение (50). Однако, хотя базовый уровень действительно сдвигается на дно, верхняя линия остается прежней (тем самым давая еще более высокий уровень). Надеюсь, это понятно, и надеюсь, что у вас есть некоторые рекомендации :-) – natario

+0

Я боялся, что это может случиться, ответ был немного пари. Я никогда не пробовал подталкивать более крупный шрифт, мой прецедент подталкивал меньший шрифт, что, очевидно, проще.Одна вещь, которую я нашел полезной при работе с текстом, заключается в подклассе представления, переопределении 'onDraw' и просто рисовании линий на холсте на базовой линии, восхождения и т. Д. Текста. Таким образом, вы можете сказать, что он измеряет. – Barend

+0

Я подумаю, сейчас я думаю, что было бы проще создать два png-файла и использовать ImageSpan. Спасибо. – natario