ShapeHelper圆角工具类

2020-05-13  本文已影响0人  薇薇浆糊

一直觉得频繁的手写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));

上一篇 下一篇

猜你喜欢

热点阅读