在我们开发中,TextView设置android:drawableLeft一定使用的非常多,但Drawable和Text同时居中显示可能不好控制,有没有好的办法解决呢?

我的方案是通过自定义TextView实现。

实现的效果图:

注:第一行为原生TextView添加android:drawableLeft
第二行为自定义TextView实现的效果。

实现思路:
继承TextView,覆盖onDraw(Canvas canvas),在onDraw中先将canvas进行translate平移,再调用父类onDraw进行绘制。

DrawableTextView.java:

package com.xing.drawabletextview;import android.content.Context;import android.graphics.Canvas;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.widget.TextView;/** * Created by Administrator on 2017/2/28. */public class DrawableTextView extends TextView {    public DrawableTextView(Context context) {        this(context, null);    }    public DrawableTextView(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public DrawableTextView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    @Override    protected void onDraw(Canvas canvas) {        // getCompoundDrawables() : Returns drawables for the left, top, right, and bottom borders.        Drawable[] drawables = getCompoundDrawables();        // 得到drawableLeft设置的drawable对象        Drawable leftDrawable = drawables[0];        if (leftDrawable != null) {            // 得到leftDrawable的宽度            int leftDrawableWidth = leftDrawable.getIntrinsicWidth();            // 得到drawable与text之间的间距            int drawablePadding = getCompoundDrawablePadding();            // 得到文本的宽度            int textWidth = (int) getPaint().measureText(getText().toString().trim());            int bodyWidth = leftDrawableWidth + drawablePadding + textWidth;            canvas.save();            canvas.translate((getWidth() - bodyWidth) / 2, 0);        }        super.onDraw(canvas);    }}

布局文件中引入:

 "match_parent"        android:layout_height="100dp"        android:orientation="horizontal">        <com.xing.drawabletextview.DrawableTextView            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:drawableLeft="@drawable/ic_one"            android:drawablePadding="10dp"            android:gravity="center_vertical"            android:text="21" />        <com.xing.drawabletextview.DrawableTextView            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:drawableLeft="@drawable/ic_two"            android:drawablePadding="10dp"            android:gravity="center_vertical"            android:text="99" />        <com.xing.drawabletextview.DrawableTextView            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:drawableLeft="@drawable/ic_three"            android:drawablePadding="10dp"            android:gravity="center_vertical"            android:text="99+" />    

更多相关文章

  1. Android常用控件TextView的属性详解
  2. Android(安卓)使用Shape绘制图形
  3. Android手机上关于viewport的理解
  4. Android对SlidingDraw组件修改
  5. 第十四周实验报告:实验四 Android程序设计
  6. TextVview的属性
  7. Android梳理不常用widget篇
  8. [置顶] Android屏幕适配全攻略(最权威的官方适配指导)
  9. TextView常用属性介绍

随机推荐

  1. c语言冒泡排序怎样实现从大到小
  2. c语言中函数调用的方式有哪些?
  3. c 语言怎么实现三个数大小排序
  4. c语言有哪些递归函数的例子?
  5. C语言中main函数的位置可以是任意的么
  6. c语言if语句格式是什么?
  7. c#为什么用的人很少
  8. c语言中如何让3个数按大小输出?
  9. C语言中double是什么意思?
  10. c++大小写字母转换的思路有几种?