Ответ 1
Таким образом, пространство в верхней части TextView является дополнением, используемым для символов вне английского языка, таких как акценты. Чтобы удалить это пространство, вы можете либо установить атрибут android:includeFontPadding
в false
в свой XML, либо сделать это программно с помощью функции setIncludeFontPadding(false)
.
Посмотрите документацию SDK для TextView, если это пока неясно.
ОТДЕЛЬНЫЙ ОТВЕТ
Если установка атрибута android:includeFontPadding
не выполняет то, что вы пытаетесь сделать, другое решение должно переопределить метод onDraw(Canvas canvas)
используемого TextView, чтобы он удалял дополнительное верхнее дополнение, которое Android добавляет к каждому TextView. После написания моего первоначального ответа я заметил, что по какой-то причине TextView включает дополнительное дополнение в дополнение к заполнению шрифта. Удаление отступов шрифта, а также добавление дополнительного дополнения выравнивает текст в верхней части TextView. Посмотрите на фрагмент кода ниже.
public class TopAlignedTextView extends TextView {
// Default constructor when inflating from XML file
public TopAlignedTextView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
// Default constructor override
public TopAlignedTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs);
setIncludeFontPadding(false); //remove the font padding
setGravity(getGravity() | Gravity.TOP); //make sure that the gravity is set to the top
}
/*This is where the magic happens*/
@Override
protected void onDraw(Canvas canvas){
TextPaint textPaint = getPaint();
textPaint.setColor(getCurrentTextColor());
textPaint.drawableState = getDrawableState();
canvas.save();
//converts 5dip into pixels
int additionalPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getContext().getResources().getDisplayMetrics());
//subtracts the additional padding from the top of the canvas that textview draws to in order to align it with the top.
canvas.translate(0, -additionalPadding);
if(getLayout() != null)
getLayout().draw(canvas);
canvas.restore();
}
}