一直觉得频繁的手写xml的圆角工具类太复杂,所以自己抽空撸了一个小工具;
主要是自己比较懒,不想写那么多shape.xml文件,而且项目大了,各种文件看的眼花缭乱,就像这样
难搞哦
于是,自己还是手撸一个吧,说白了就是纯Java写drawable,然后利用view.setBackground(Drawable drawable),view.setForeground(Drawable drawable)方法展示
为了方便,也只打算写一个类,那就单例模式吧
private volatile static ShapeHelper instance = null;private ShapeHelper() {}public static ShapeHelper getInstance() { if (instance == null) { synchronized (ShapeHelper.class) { if (instance == null) { instance = new ShapeHelper(); } } } return instance;}
好了,先想一下需要的效果,常用的几种情况
1.纯底色和渐变底色,2带边框和不带边框,3.边框圆角,部分圆角,不是圆角
先补充下知识点
GradientDrawable drawable =new GradientDrawable();
drawable.setCornerRadius(radius);//设置圆角
drawable.setGradientType(gradientType);//设置渐变方式{RECTANGLE, OVAL, LINE, RING}
//drawable.setOrientation(orientation);//设置渐变的方向{TOP_BOTTOM,TR_BL,RIGHT_LEFT,BR_TL,BOTTOM_TOP,BL_TR,LEFT_RIGHT,TL_BR}
drawable.setColors(backgroundColor);//设置背景色
drawable.setStroke(strokeWidth, strokeColor);//设置边框和边框颜色
drawable.setStroke(strokeWidth, strokeColor, dashWidth, dashGap);//设置边框和边框颜色 虚线边框虚线的间距
所以有了这个类
另外,为了方便做点击和选中的状态,新增了方法
public StateListDrawable createStateListDrawable(Drawable downPressed,Drawable upPressed,boolean checkeOrPress) { //动态生成Selector int pressed = android.R.attr.state_pressed; //取负值就表示pressed为false的意思 if (checkeOrPress){ pressed=android.R.attr.state_checked;//选中状态 } StateListDrawable drawable = new StateListDrawable(); drawable.addState(new int[]{pressed}, downPressed);// 状态 , 设置按下的图片 drawable.addState(new int[]{-pressed}, upPressed);//默认状态,默认状态下的图片 return drawable;}
完整代码如下
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.StateListDrawable;
import android.support.annotation.ColorInt;
public class ShapeHelper{
//填充 纯色 或 渐变色(2)
//边框 虚线,实线,无(3)
//圆角 (1)
//设置到View中view.setBackgroundDrawable(drawable);
private volatile static ShapeHelperinstance =null;
private ShapeHelper(){
}
public static ShapeHelpergetInstance(){
if (instance ==null){
synchronized (ShapeHelper.class){
if (instance ==null){
instance =new ShapeHelper();
}
}
}
return instance;
}
// GradientDrawable drawable = new GradientDrawable();
// //基础设置-----------
// //设置圆角大小float radius
// drawable.setCornerRadius();
//
// //边框部分设置------------
// //实线:int strokeWidth,int strokeColor
// //虚线:int strokeWidth,int strokeColor,float dashWidth, float dashGap
// drawable.setStroke();
//
// //填充设置----------
//
// //纯色填充int backgroundColor
// drawable.setColor();
//
// //渐变色填充
// //设置渐变形状,包括RECTANT,OVAL,LINE,RING
// drawable.setGradientType(GradientDrawable.RECTANGLE);
// //设置渐变方向
// drawable.setOrientation(GradientDrawable.Orientation.LEFT_RIGHT);
// //设置渐变颜色
// drawable.setColors();
//无边框/圆角/单色
public GradientDrawablecreateSingleDrawableNoBorder(float radius,
@ColorInt int backgroundColor){
GradientDrawable drawable =new GradientDrawable();
drawable.setCornerRadius(radius);
drawable.setColor(backgroundColor);
return drawable;
}
//无边框/圆角/渐变色/渐变形状{RECTANGLE, OVAL, LINE, RING}
//渐变方向{ TOP_BOTTOM,TR_BL,RIGHT_LEFT,BR_TL,BOTTOM_TOP,BL_TR,LEFT_RIGHT,TL_BR}
public GradientDrawablecreateMixDrawableNoBorder(float radius,
@ColorInt int[]backgroundColor,
int gradientType,
GradientDrawable.Orientationorientation){
GradientDrawable drawable =new GradientDrawable();
drawable.setCornerRadius(radius);
drawable.setGradientType(gradientType);
drawable.setOrientation(orientation);
drawable.setColors(backgroundColor);
return drawable;
}
//实线/圆角/单色/
public GradientDrawablecreateSingleDrawableFillBorder(float radius,
int strokeWidth,
int strokeColor,
@ColorInt int backgroundColor){
GradientDrawable drawable =new GradientDrawable();
drawable.setCornerRadius(radius);
drawable.setStroke(strokeWidth, strokeColor);
drawable.setColor(backgroundColor);
return drawable;
}
//实线/圆角/渐变色/渐变形状{RECTANGLE, OVAL, LINE, RING}
//渐变方向{ TOP_BOTTOM,TR_BL,RIGHT_LEFT,BR_TL,BOTTOM_TOP,BL_TR,LEFT_RIGHT,TL_BR}
public GradientDrawablecreateMixDrawableFillBorder(float radius,
int strokeWidth,
int strokeColor,
@ColorInt int[]backgroundColor,
int gradientType,
GradientDrawable.Orientationorientation){
GradientDrawable drawable =new GradientDrawable();
drawable.setCornerRadius(radius);
drawable.setStroke(strokeWidth, strokeColor);
drawable.setGradientType(gradientType);
drawable.setOrientation(orientation);
drawable.setColors(backgroundColor);
return drawable;
}
//虚线/圆角/单色/
public GradientDrawablecreateSingleDrawableDashBorder(float radius,
int strokeWidth,
int strokeColor,
float dashWidth,
float dashGap,
@ColorInt int backgroundColor){
GradientDrawable drawable =new GradientDrawable();
drawable.setCornerRadius(radius);
drawable.setStroke(strokeWidth, strokeColor, dashWidth, dashGap);
drawable.setColor(backgroundColor);
return drawable;
}
//虚线/圆角/渐变色/渐变形状{RECTANGLE, OVAL, LINE, RING}
//渐变方向{ TOP_BOTTOM,TR_BL,RIGHT_LEFT,BR_TL,BOTTOM_TOP,BL_TR,LEFT_RIGHT,TL_BR}
public GradientDrawablecreateMixDrawableDashBorder(float radius,
int strokeWidth,
int strokeColor,
float dashWidth,
float dashGap,
@ColorInt int[]backgroundColor,
int gradientType,
GradientDrawable.Orientationorientation){
GradientDrawable drawable =new GradientDrawable();
drawable.setCornerRadius(radius);
drawable.setStroke(strokeWidth, strokeColor, dashWidth, dashGap);
drawable.setGradientType(gradientType);
drawable.setOrientation(orientation);
drawable.setColors(backgroundColor);
return drawable;
}
//实线/圆角/渐变色/渐变形状{RECTANGLE}
//渐变方向{LEFT_RIGHT}
public GradientDrawablecreateNomalMixDrawableFillBorder(float radius,
int strokeWidth,
int strokeColor,
@ColorInt int[]backgroundColor){
GradientDrawable drawable =new GradientDrawable();
drawable.setCornerRadius(radius);
drawable.setStroke(strokeWidth, strokeColor);
drawable.setGradientType(GradientDrawable.RECTANGLE);
drawable.setOrientation(GradientDrawable.Orientation.LEFT_RIGHT);
drawable.setColors(backgroundColor);
return drawable;
}
public GradientDrawablecreateDrawable(float topLeftRadius,
float topRightRadius,
float bottomRightRadius,
float bottomLeftRadius,
int strokeWidth,
int strokeColor,
float dashWidth,
float dashGap,
int gradientType,
GradientDrawable.Orientationorientation,
@ColorInt int...backgroundColor){
GradientDrawable drawable =new GradientDrawable();
drawable.setCornerRadii(new float[]{topLeftRadius, topLeftRadius, topRightRadius, topRightRadius, bottomRightRadius, bottomRightRadius, bottomLeftRadius, bottomLeftRadius});
if (strokeWidth >=0){
if (dashWidth <=0 ||dashGap <=0){
drawable.setStroke(strokeWidth, strokeColor);
} else {
drawable.setStroke(strokeWidth, strokeColor, dashWidth, dashGap);
}
}
if (-1!=gradientType)
drawable.setGradientType(gradientType);
if (null!=orientation)
drawable.setOrientation(orientation);
if (backgroundColor.length==1){
drawable.setColor(backgroundColor[0]);
}else {
drawable.setColors(backgroundColor);
}
return drawable;
}
public StateListDrawablecreateStateListDrawable(DrawabledownPressed,DrawableupPressed,boolean checkeOrPress){
//动态生成Selector
int pressed = android.R.attr.state_pressed; //取负值就表示pressed为false的意思
if (checkeOrPress){
pressed=android.R.attr.state_checked;//选中状态
}
StateListDrawable drawable =new StateListDrawable();
drawable.addState(new int[]{pressed}, downPressed);// 状态 , 设置按下的图片
drawable.addState(new int[]{-pressed}, upPressed);//默认状态,默认状态下的图片
return drawable;
}
}
工具使用
rbLeft.setBackground(ShapeHelper.getInstance().createStateListDrawable(
ShapeHelper.getInstance().createDrawable(DisplayUtil.dp2Px(5), 0, 0, DisplayUtil.dp2Px(5),
-1, -1, -1, -1, GradientDrawable.RECTANGLE, null, 0xFFFFF0F0),
ShapeHelper.getInstance().createDrawable(DisplayUtil.dp2Px(5), 0, 0, DisplayUtil.dp2Px(5),
-1, -1, -1, -1, GradientDrawable.RECTANGLE, null, 0xFFFFFFFF)
, true));
rbRight.setBackground(ShapeHelper.getInstance().createStateListDrawable(
ShapeHelper.getInstance().createDrawable(0, DisplayUtil.dp2Px(5), DisplayUtil.dp2Px(5), 0,
-1, -1, -1, -1, GradientDrawable.RECTANGLE, null, 0xFFFFF0F0),
ShapeHelper.getInstance().createDrawable(0, DisplayUtil.dp2Px(5), DisplayUtil.dp2Px(5), 0,
-1, -1, -1, -1, GradientDrawable.RECTANGLE, null, 0xFFFFFFFF)
, true));
网友评论