自定义TextView,设置Drawable图标居中显示

在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!" />


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值