自定义控件让TextView(Radiobutton)、Button的drawableLeft和drawableRight与文本一起居中显示

TextView的drawableLeft、drawableRight和drawableTop是一个常用、好用的属性,可以在文本的上下左右放置一个图片,而不使用更加复杂布局就能达到,我也常常喜欢用RadioButton的这几个属性实现很多效果,但是苦于不支持让drawbleLeft与文本一起居中,设置gravity为center也无济于事,终于有空研究了一下,这里与大家一起分享。


布局XML

[html]  view plain copy
  1. <com.assistant.expand.customview.DrawableCenterButton  
  2.                         android:gravity="left|center_vertical"  
  3.                         android:drawableLeft="@drawable/icon_erweima"  
  4.                         android:drawablePadding="5dp"  
  5.                 android:id="@+id/btn_scale"  
  6.                 android:layout_width="fill_parent"  
  7.                 android:layout_height="fill_parent"  
  8.                 android:background="@android:color/transparent"  
  9.                 android:singleLine="true"  
  10.                 android:text="扫描二维码签到"  
  11.                 android:textColor="@color/color_button2"  
  12.                 android:textSize="17sp" />  



[java]  view plain copy
  1. /** 
  2.  * drawableLeft与文本一起居中显示 
  3.  *  
  4.  *  
  5.  */  
  6. public class DrawableCenterTextView extends TextView {  
  7.   
  8.     public DrawableCenterTextView(Context context, AttributeSet attrs,  
  9.             int defStyle) {  
  10.         super(context, attrs, defStyle);  
  11.     }  
  12.   
  13.     public DrawableCenterTextView(Context context, AttributeSet attrs) {  
  14.         super(context, attrs);  
  15.     }  
  16.   
  17.     public DrawableCenterTextView(Context context) {  
  18.         super(context);  
  19.     }  
  20.   
  21.     @Override  
  22.     protected void onDraw(Canvas canvas) {  
  23.         Drawable[] drawables = getCompoundDrawables();  
  24.         if (drawables != null) {  
  25.             Drawable drawableLeft = drawables[0];  
  26.             if (drawableLeft != null) {  
  27.                 float textWidth = getPaint().measureText(getText().toString());  
  28.                 int drawablePadding = getCompoundDrawablePadding();  
  29.                 int drawableWidth = 0;  
  30.                 drawableWidth = drawableLeft.getIntrinsicWidth();  
  31.                 float bodyWidth = textWidth + drawableWidth + drawablePadding;  
  32.                 canvas.translate((getWidth() - bodyWidth) / 20);  
  33.             }  
  34.         }  
  35.         super.onDraw(canvas);  
  36.     }  
  37. }  


下面是用Button的Right 例子

[java]  view plain copy
  1. /** 
  2.  * drawableRight与文本一起居中显示 
  3.  *  
  4.  *  
  5.  */  
  6. public class DrawableCenterButton extends Button {  
  7.   
  8.     public DrawableCenterButton(Context context) {  
  9.         super(context);  
  10.         // TODO Auto-generated constructor stub  
  11.     }  
  12.   
  13.     public DrawableCenterButton(Context context, AttributeSet attrs,  
  14.     int defStyle) {  
  15.         super(context, attrs, defStyle);  
  16.     }  
  17.   
  18.     public DrawableCenterButton(Context context, AttributeSet attrs) {  
  19.         super(context, attrs);  
  20.     }  
  21.   
  22.   
  23.     @Override  
  24.     protected void onDraw(Canvas canvas) {  
  25.         Drawable[] drawables = getCompoundDrawables();  
  26.         if (drawables != null) {  
  27.             Drawable drawableLeft = drawables[2];  
  28.                 if (drawableLeft != null) {  
  29.               
  30.                 float textWidth = getPaint().measureText(getText().toString());  
  31.                 int drawablePadding = getCompoundDrawablePadding();  
  32.                 int drawableWidth = 0;  
  33.                 drawableWidth = drawableLeft.getIntrinsicWidth();  
  34.                 float bodyWidth = textWidth + drawableWidth + drawablePadding;  
  35.                 setPadding(00, (int)(getWidth() - bodyWidth), 0);  
  36.                 canvas.translate((getWidth() - bodyWidth) / 20);  
  37.             }  
  38.         }  
  39.         super.onDraw(canvas);  
  40.     }  
  41. }  

你可能感兴趣的:(自定义控件让TextView(Radiobutton)、Button的drawableLeft和drawableRight与文本一起居中显示)