[英]How to remove the top and bottom space on textview of Android
当我将以下XML
到布局文件时,我可以看到下图。 如果你看到它,你就会意识到TextView
有顶部和底部空间。
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="E1"
android:background="#ff00ff00"/>
我想删除空间。 如何删除它? 这叫什么? 如果有人有线索..请告诉我。 提前致谢。
尝试android:includeFontPadding="false"
看看是否有帮助。 根据我的经验,这会有所帮助,但无法将 TextView 尺寸减小到精确的像素完美文本大小。
唯一的选择,可能会或可能不会提供更好的结果,是作弊并硬连接尺寸以匹配文本大小,例如"24sp"
而不是"wrap_content"
作为高度。
我有同样的问题。 属性android:includeFontPadding="false"
对我不起作用。 我以这种方式解决了这个问题:
public class TextViewWithoutPaddings extends TextView {
private final Paint mPaint = new Paint();
private final Rect mBounds = new Rect();
public TextViewWithoutPaddings(Context context) {
super(context);
}
public TextViewWithoutPaddings(Context context, AttributeSet attrs) {
super(context, attrs);
}
public TextViewWithoutPaddings(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(@NonNull Canvas canvas) {
final String text = calculateTextParams();
final int left = mBounds.left;
final int bottom = mBounds.bottom;
mBounds.offset(-mBounds.left, -mBounds.top);
mPaint.setAntiAlias(true);
mPaint.setColor(getCurrentTextColor());
canvas.drawText(text, -left, mBounds.bottom - bottom, mPaint);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
calculateTextParams();
setMeasuredDimension(mBounds.width() + 1, -mBounds.top + 1);
}
private String calculateTextParams() {
final String text = getText().toString();
final int textLength = text.length();
mPaint.setTextSize(getTextSize());
mPaint.getTextBounds(text, 0, textLength, mBounds);
if (textLength == 0) {
mBounds.right = mBounds.left;
}
return text;
}
}
android:includeFontPadding="false"
非常好,但不能准确地得到它。 有时你想要边界线的准确性,所以你可以通过应用负边距自己弄清楚:
尝试将底部和顶部边距设置为负值。
是这样的:
android:layout_marginTop="-5dp"
android:layout_marginBottom="-5dp"
相应地调整值。
这是拯救我们一天的代码。 它是使用来自maksimko的 mono C# 代码改编的:
public class TopAlignedTextView extends TextView {
public TopAlignedTextView(Context context) {
super(context);
}
/*This is where the magic happens*/
@Override
protected void onDraw(Canvas canvas){
float offset = getTextSize() - getLineHeight();
canvas.translate(0, offset);
super.onDraw(canvas);
}
}
仍然需要使用textView.setIncludeFontPadding(false)
,因为我们要将TextViews
与不同的字体大小对齐。
我遇到了同样的问题。 这是一个很好的答案: How to align the text to top of TextView?
但代码还未完成,并不支持所有字体大小。 换线
int additionalPadding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getContext().getResources().getDisplayMetrics());
到
int additionalPadding = getTextSize() - getLineHeight();
完整的 C# 代码(单声道)删除顶部偏移:
public class TextControl : TextView {
public TextControl (Context context) : base (context)
{
SetIncludeFontPadding (false);
Gravity = GravityFlags.Top;
}
protected override void OnDraw (Android.Graphics.Canvas canvas)
{
if (base.Layout == null)
return;
Paint.Color = new Android.Graphics.Color (CurrentTextColor);
Paint.DrawableState = GetDrawableState ();
canvas.Save ();
var offset = TextSize - LineHeight;
canvas.Translate (0, offset);
base.Layout.Draw (canvas);
canvas.Restore ();
}
}
只是想在DynamicMind的回答中补充一点,您在 TextView 周围看到间距的原因是在它们默认使用的9 补丁背景中进行填充。
9-patch 技术允许您指定一个有效填充的内容区域。 除非您明确设置视图的填充,否则将使用该填充。 例如,当您以编程方式将 9 补丁背景设置为已设置填充的视图时,它们将被覆盖。 反之亦然,如果您设置填充,它们会覆盖 9 补丁背景设置的内容。
不幸的是,在 XML 布局中,无法确定这些操作的顺序。 我认为仅从 TextViews 中删除背景会有所帮助:
android:background="@null"
public class TopAlignedTextView extends TextView {
public TopAlignedTextView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public TopAlignedTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs);
setIncludeFontPadding(false); //remove the font padding
setGravity(getGravity() | Gravity.TOP);
}
@Override
protected void onDraw(Canvas canvas) {
TextPaint textPaint = getPaint();
textPaint.setColor(getCurrentTextColor());
textPaint.drawableState = getDrawableState();
canvas.save();
//remove extra font padding
int yOffset = getHeight() - getBaseline();
canvas.translate(0, - yOffset / 2);
if (getLayout() != null) {
getLayout().draw(canvas);
}
canvas.restore();
}
}
稍微修改此答案以使用 kotlin class 并扩展AppCompatTextView
,修剪垂直填充。
它允许设置android:fontFamily
。 为提高性能,方法calculateTextParams()
从onDraw()
) 移出。 未测试多行文本:
import android.content.Context
import android.graphics.Canvas
import android.graphics.Rect
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatTextView
class NoPaddingTextView : AppCompatTextView
{
private val boundsRect = Rect()
private val textParams = calculateTextParams()
constructor(context : Context?)
: super(context)
constructor(context : Context?, attrs : AttributeSet?)
: super(context, attrs)
constructor(context : Context?, attrs : AttributeSet?, defStyleAttr : Int)
: super(context, attrs, defStyleAttr)
override fun onDraw(canvas : Canvas)
{
with(boundsRect) {
paint.isAntiAlias = true
paint.color = currentTextColor
canvas.drawText(textParams,
-left.toFloat(),
(-top - bottom).toFloat(),
paint)
}
}
override fun onMeasure(widthMeasureSpec : Int, heightMeasureSpec : Int)
{
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
calculateTextParams()
setMeasuredDimension(boundsRect.width() + 1, -boundsRect.top + 1)
}
private fun calculateTextParams() : String
{
return text.toString()
.also {text ->
text.length.let {textLength ->
paint.textSize = textSize
paint.getTextBounds(text, 0, textLength, boundsRect)
if(textLength == 0) boundsRect.right = boundsRect.left
}
}
}
}
您是否定义了布局边距? 例如:
android:layout_marginTop="5dp"
否则,如果您的文本视图被包裹在 LinearLayout 或其他容器中,那么冷视图也有填充或边距。
在 LinearLayout 内部,默认填充可能是个问题。 尝试将其设置为 0dp。 它对我有用。
TopAlignedTextView代码的答案: TopAlignedTextView@GitHub
通过布局使用它:
<com.github.captain_miao.view.TopAlignedTextView
android:id="@+id/text_a"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:text="@string/text_demo_a"
/>
我解决这个问题的方法很老套,但我设法让文本位于我想要的位置,方法是将文本视图的高度设置为 static 并摆弄它直到它刚好适合文本。 在我的例子中,我使用的字体样式的高度为 64sp,所以我将 textview 的高度设置为 50sp,它工作正常。 我还必须将 foreground_gravity 设置为底部。
android:background="@android:drawable/editbox_background"
根据您的需要使用它,将其更改为您想要的 editbox_background。 因为 android 提供了一些像上面代码一样的后台构建,请根据您的要求选择。 可能对你有帮助。
android:includeFontPadding="false"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.