如何让TextView的文字与左侧Drawable整体居中对齐?
解决TextView中文字与左侧Drawable整体居中的问题
兄弟,这个坑我之前踩过!默认的drawableLeft是绑定在TextView的左边缘的,哪怕你设置了gravity="center",也只会让文字单独居中,图标还是钉在最左边。给你两个实用的解决方案,按需选就行:
方案一:用LinearLayout包裹(最简单直接)
把TextView和ImageView放进一个横向LinearLayout,让这个容器整体居中,这样文字和图标就会作为一个整体居中显示。代码示例:
<LinearLayout android:layout_width="0dp" android:layout_height="@dimen/_40sdp" android:layout_weight="5" android:gravity="center" android:orientation="horizontal" android:layout_marginLeft="@dimen/_10sdp"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_cloud" android:layout_marginRight="@dimen/_10sdp"/> <!-- 这里控制图标和文字的间距 --> <TextView android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center_vertical" android:text="@string/up"/> </LinearLayout>
这个方案不用写自定义控件,布局逻辑一目了然,后期调整间距或者样式都特别方便。
方案二:自定义TextView(适合多处复用的场景)
如果项目里很多地方都需要这种效果,自定义一个TextView会更高效。重写onDraw方法,手动计算图标的位置,让它跟着文字一起居中:
public class CenteredDrawableTextView extends androidx.appcompat.widget.AppCompatTextView { public CenteredDrawableTextView(Context context) { super(context); } public CenteredDrawableTextView(Context context, AttributeSet attrs) { super(context, attrs); } public CenteredDrawableTextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onDraw(Canvas canvas) { Drawable[] drawables = getCompoundDrawables(); if (drawables != null) { Drawable leftDrawable = drawables[0]; if (leftDrawable != null) { // 获取文字宽度 float textWidth = getPaint().measureText(getText().toString()); int drawableWidth = leftDrawable.getIntrinsicWidth(); // 计算文字+图标+间距的总宽度 float totalWidth = textWidth + drawableWidth + getCompoundDrawablePadding(); // 计算偏移量,让整体居中 float offset = (getWidth() - totalWidth) / 2 - getPaddingLeft(); canvas.save(); canvas.translate(offset, 0); super.onDraw(canvas); canvas.restore(); return; } } super.onDraw(canvas); } }
然后在布局里直接用这个自定义控件,原来的属性大部分都能保留:
<com.yourpackage.CenteredDrawableTextView android:layout_marginLeft="@dimen/_10sdp" android:layout_width="0dp" android:layout_height="@dimen/_40sdp" android:layout_weight="5" android:gravity="center" android:drawableLeft="@drawable/ic_cloud" android:drawablePadding="@dimen/_10sdp" <!-- 这里用drawablePadding控制图标和文字的间距 --> android:text="@string/up" />
对了,你原来代码里的paddingLeft,如果用方案一的话,记得把它移到LinearLayout的margin或者ImageView的margin上,避免出现多余的间距哦。
内容的提问来源于stack exchange,提问作者Cosmic Dev
相关产品推荐
相关产品推荐

