在Android中,有时需要图标和文字在布局中居中显示,比如这种场景:
搜索图标和文字是紧挨着,点击整个白色区域会触发相应的事件,这种情况下如何只用一个View来达到这种效果呢。当然如果是以前就会用一个RelativeLayout来作为点击区域,再加上一个TextView来显示文本,然而我并不喜欢这种实现方式。
看下对比效果图:
代码实现:
public class DrawableCenterTextView extends TextView {
public DrawableCenterTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
// 获取TextView的Drawable对象,返回的数组长度应该是4,对应左上右下
Drawable[] drawables = getCompoundDrawables();
if (drawables != null) {
Drawable drawable = drawables[0];
if (drawable != null) {
// 当左边Drawable的不为空时,测量要绘制文本的宽度
float textWidth = getPaint().measureText(getText().toString());
int drawablePadding = getCompoundDrawablePadding();
int drawableWidth = drawable.getIntrinsicWidth();
// 计算总宽度(文本宽度 + drawablePadding + drawableWidth)
float bodyWidth = textWidth + drawablePadding + drawableWidth;
// 移动画布开始绘制的X轴
canvas.translate((getWidth() - bodyWidth) / 2, 0);
} else if ((drawable = drawables[1]) != null) {
// 否则如果上边的Drawable不为空时,获取文本的高度
Rect rect = new Rect();
getPaint().getTextBounds(getText().toString(), 0, getText().toString().length(), rect);
float textHeight = rect.height();
int drawablePadding = getCompoundDrawablePadding();
int drawableHeight = drawable.getIntrinsicHeight();
// 计算总高度(文本高度 + drawablePadding + drawableHeight)
float bodyHeight = textHeight + drawablePadding + drawableHeight;
// 移动画布开始绘制的Y轴
canvas.translate(0, (getHeight() - bodyHeight) / 2);
}
}
super.onDraw(canvas);
}
}
实现思路:
主要是通过计算所要绘制的高度或宽度,计算在居中显示时XY轴的起点坐标,并通过移动画布开始绘制的坐标来达到居中显示的效果。
layout.xml中的代码如下:
<com.ionesmile.testalbum.view.DrawableCenterTextView
android:layout_width="200dp"
android:layout_height="100dp"
android:gravity="center_vertical"
android:background="#DDDDDD"
android:drawableLeft="@mipmap/ic_launcher"
android:text="Hello World!" />
<com.ionesmile.testalbum.view.DrawableCenterTextView
android:layout_width="200dp"
android:layout_height="100dp"
android:gravity="center_horizontal"
android:background="#DDDDDD"
android:layout_marginTop="30dp"
android:drawableTop="@mipmap/ic_launcher"
android:text="Hello World!" />