大家应该都知道,圆角按钮是我们在做界面时常常遇到的UI样式。通常的办法,是做一个可拉的,比如这样:
& lt; & # 63; xml version=" 1.0 " encoding=" utf - 8 " & # 63;比; & lt;形状 xmlns: android=" http://schemas.android.com/apk/res/android " android:形状=熬匦巍北? & lt; !——填充的颜色——比; & lt;固体android:颜色=" # ffae00”/比; & lt; !——圆角的半径——比; & lt;角落android:半径=" 10 dp/比; & lt;/shape>
在布局文件里按钮的背景属性设上这个可拉的。xml,就可以了。
然而这样做的话,每次弄个按钮都得新做一个可拉的文件,各种可拉的多了看着就乱。
是不是可以把颜色和半径放到按钮的属性里去,这样就不用每次再拖一个drawable.xml了是吧?
& lt; widget.RoundCornerButton android: id=癅 + id/btn_commit” android: layout_width=" 100 dp” android: layout_height=" 40 dp " android:重力="中心" android:文本="我的按钮” 应用:rcb_backgroundColor=" @color/黄” 应用:rcb_backgroundColorDisabled=" @color/light_grey” 应用:rcb_cornerRadius=" 20 dp”/在
如果可以这样在布局文件里直接设置背景色和圆角半径,是不是很方便,虽然不如可拉的灵活,但是已经足以应付设计同学给出的圆角按钮的需求了。
我们就以定义自己的styleable属性开始吧
& lt; declare-styleable name=" RoundCornerButton比; & lt; attr name==把丈?皉cb_backgroundColor”格式比; & lt; attr name==把丈?皉cb_backgroundColorDisabled”格式比; & lt; attr=name=" rcb_cornerRadius "格式"维度"/比; & lt;/declare-styleable>
从可拉的扩展一个自己的可拉的,很简单
-
<李>从构造方法传入颜色和半径,并创建一个实习的画笔;李>
<李>覆写画方法,有现成的画圆角矩形的方法可以调用;李>
<李>暴露一个setRect方法给外边,用于设置绘制区域的宽高。
李>
类RoundCornerDrawable延伸可拉的{ 最后一个int颜色; 最后浮动半径; 最终油漆涂料; 最后RectF RectF; RoundCornerDrawable (int颜色、浮动半径){ 这一点。颜色=颜色; 这一点。半径=半径;//实心的画笔 这一点。涂=new (); paint.setStyle (Paint.Style.FILL); paint.setAntiAlias(真正的); paint.setColor(颜色); 这一点。rectF=new rectF (); }//用于设置可拉的宽高 公共空间setRect (int宽度,int高度){ this.rectF。左=0; this.rectF。顶级=0; this.rectF。正确的=宽度; this.rectF。底=身高; } @Override 公共空画(@NonNull帆布画布){ 画布。drawRoundRect (rectF,半径,半径、油漆);//画圆角矩形,现成的方法 }//其余方法略 }
<强>定义自己的按钮类,有这么几个要点:强>
-
<李>与通常的自定义观点一样,覆写三个构造方法;李>
<李>从AttributeSet里读取自定义的属性写成backgroundColor和cornerRadius、这里暂时忽略backgroundColorDisabled;李>
<李>每一种状态(例如普通,禁用,按下)是一个RoundCornerDrawable,组合成一个StateListDrawable;李>
<李> onLayout的时候,记得改变每一个RoundCornerDrawable的尺寸。李>
公开课RoundCornerButton延伸AppCompatButton { 私人int colorNormal; 私人cornerRadius浮动; 私人RoundCornerDrawable bgDrawableNormal=零;//省略三个构造方法//构造方法最后一定要调用initCornerBackground完成初始化 私人空间initCornerBackground (AttributeSet attrs int defStyleAttr) { TypedArray a=getContext ()。obtainStyledAttributes (attrs R.styleable。RoundCornerButton defStyleAttr 0); 这一点。cornerRadius=a.getDimension (R.styleable。RoundCornerButton_rcb_cornerRadius, 0); 这一点。colorNormal=a.getColor (R.styleable。RoundCornerButton_rcb_backgroundColor, 0); makeBackgroundDrawable (); a.recycle (); } 私人空间makeBackgroundDrawable () { bgDrawableNormal=new RoundCornerDrawable(这一点。colorNormal this.cornerRadius); bgDrawableNormal.setRect (getWidth(),获得());//设计通常会给出禁用时的样式以及按下时的样式//所以这里用使用StateListDrawable StateListDrawable bgDrawable=new StateListDrawable (); bgDrawable。addState(新int [] {android.R.attr。state_enabled -android.R.attr。state_pressed}, bgDrawableNormal);//每多一种状态,在这里多加一项 setBackgroundDrawable (bgDrawable); } @Override 保护无效alt=" Android中快速便捷的实现圆角按钮方法详解“>安卓系统中快速便捷的实现圆角按钮方法详解