selector+shape使用工具类

来源:互联网 发布:mac系统备忘录怎么复原 编辑:程序博客网 时间:2024/06/05 04:10

为了避免在drawable文件夹下创建太多的selector,避免同一个样式,因为忘记了名字而重复创建。我们创建一个工具类来实现我们想要的样式,需要的样式,直接在代码中实现。
工具类如下:

import android.content.Context;import android.content.res.ColorStateList;import android.graphics.Color;import android.graphics.drawable.ColorDrawable;import android.graphics.drawable.Drawable;import android.graphics.drawable.GradientDrawable;import android.graphics.drawable.StateListDrawable;import android.support.annotation.ColorInt;import android.support.annotation.Dimension;import android.support.annotation.DrawableRes;import android.support.annotation.IntDef;import android.support.v4.content.ContextCompat;public class SelectorFactory {    public static ShapeSelector newShapeSelector() {        return new ShapeSelector();    }    public static final class ShapeSelector {        @IntDef({GradientDrawable.RECTANGLE, GradientDrawable.OVAL,                GradientDrawable.LINE, GradientDrawable.RING})        private @interface Shape {}        private int mShape;               //the shape of background        private int mDefaultBgColor;      //default background color        private int mDisabledBgColor;     //state_enabled = false        private int mPressedBgColor;      //state_pressed = true        private int mSelectedBgColor;     //state_selected = true        private int mFocusedBgColor;      //state_focused = true        private int mStrokeWidth;         //stroke width in pixel        private int mDefaultStrokeColor;  //default stroke color        private int mDisabledStrokeColor; //state_enabled = false        private int mPressedStrokeColor;  //state_pressed = true        private int mSelectedStrokeColor; //state_selected = true        private int mFocusedStrokeColor;  //state_focused = true        private int mCornerRadius;        //corner radius        private boolean hasSetDisabledBgColor = false;        private boolean hasSetPressedBgColor = false;        private boolean hasSetSelectedBgColor = false;        private boolean hasSetFocusedBgColor = false;        private boolean hasSetDisabledStrokeColor = false;        private boolean hasSetPressedStrokeColor = false;        private boolean hasSetSelectedStrokeColor = false;        private boolean hasSetFocusedStrokeColor = false;        private ShapeSelector() {            //initialize default values            mShape = GradientDrawable.RECTANGLE;            mDefaultBgColor = Color.TRANSPARENT;            mDisabledBgColor = Color.TRANSPARENT;            mPressedBgColor = Color.TRANSPARENT;            mSelectedBgColor = Color.TRANSPARENT;            mFocusedBgColor = Color.TRANSPARENT;            mStrokeWidth = 0;            mDefaultStrokeColor = Color.TRANSPARENT;            mDisabledStrokeColor = Color.TRANSPARENT;            mPressedStrokeColor = Color.TRANSPARENT;            mSelectedStrokeColor = Color.TRANSPARENT;            mFocusedStrokeColor = Color.TRANSPARENT;            mCornerRadius = 0;        }        public ShapeSelector setShape(@Shape int shape) {            mShape = shape;            return this;        }        public ShapeSelector setDefaultBgColor(@ColorInt int color) {            mDefaultBgColor = color;            if (!hasSetDisabledBgColor)                mDisabledBgColor = color;            if (!hasSetPressedBgColor)                mPressedBgColor = color;            if (!hasSetSelectedBgColor)                mSelectedBgColor = color;            if (!hasSetFocusedBgColor)                mFocusedBgColor = color;            return this;        }        public ShapeSelector setDisabledBgColor(@ColorInt int color) {            mDisabledBgColor = color;            hasSetDisabledBgColor = true;            return this;        }        public ShapeSelector setPressedBgColor(@ColorInt int color) {            mPressedBgColor = color;            hasSetPressedBgColor = true;            return this;        }        public ShapeSelector setSelectedBgColor(@ColorInt int color) {            mSelectedBgColor = color;            hasSetSelectedBgColor = true;            return this;        }        public ShapeSelector setFocusedBgColor(@ColorInt int color) {            mFocusedBgColor = color;            hasSetPressedBgColor = true;            return this;        }        public ShapeSelector setStrokeWidth(@Dimension int width) {            mStrokeWidth = width;            return this;        }        public ShapeSelector setDefaultStrokeColor(@ColorInt int color) {            mDefaultStrokeColor = color;            if (!hasSetDisabledStrokeColor)                mDisabledStrokeColor = color;            if (!hasSetPressedStrokeColor)                mPressedStrokeColor = color;            if (!hasSetSelectedStrokeColor)                mSelectedStrokeColor = color;            if (!hasSetFocusedStrokeColor)                mFocusedStrokeColor = color;            return this;        }        public ShapeSelector setDisabledStrokeColor(@ColorInt int color) {            mDisabledStrokeColor = color;            hasSetDisabledStrokeColor = true;            return this;        }        public ShapeSelector setPressedStrokeColor(@ColorInt int color) {            mPressedStrokeColor = color;            hasSetPressedStrokeColor = true;            return this;        }        public ShapeSelector setSelectedStrokeColor(@ColorInt int color) {            mSelectedStrokeColor = color;            hasSetSelectedStrokeColor = true;            return this;        }        public ShapeSelector setFocusedStrokeColor(@ColorInt int color) {            mFocusedStrokeColor = color;            hasSetFocusedStrokeColor = true;            return this;        }        public ShapeSelector setCornerRadius(@Dimension int radius) {            mCornerRadius = radius;            return this;        }        public StateListDrawable create() {            StateListDrawable selector = new StateListDrawable();            //enabled = false            if (hasSetDisabledBgColor || hasSetDisabledStrokeColor) {                GradientDrawable disabledShape = getItemShape(mShape, mCornerRadius,                        mDisabledBgColor, mStrokeWidth, mDisabledStrokeColor);                selector.addState(new int[]{-android.R.attr.state_enabled}, disabledShape);            }            //pressed = true            if (hasSetPressedBgColor || hasSetPressedStrokeColor) {                GradientDrawable pressedShape = getItemShape(mShape, mCornerRadius,                        mPressedBgColor, mStrokeWidth, mPressedStrokeColor);                selector.addState(new int[]{android.R.attr.state_pressed}, pressedShape);            }            //selected = true            if (hasSetSelectedBgColor || hasSetSelectedStrokeColor) {                GradientDrawable selectedShape = getItemShape(mShape, mCornerRadius,                        mSelectedBgColor, mStrokeWidth, mSelectedStrokeColor);                selector.addState(new int[]{android.R.attr.state_selected}, selectedShape);            }            //focused = true            if (hasSetFocusedBgColor || hasSetFocusedStrokeColor) {                GradientDrawable focusedShape = getItemShape(mShape, mCornerRadius,                        mFocusedBgColor, mStrokeWidth, mFocusedStrokeColor);                selector.addState(new int[]{android.R.attr.state_focused}, focusedShape);            }            //default            GradientDrawable defaultShape = getItemShape(mShape, mCornerRadius,                    mDefaultBgColor, mStrokeWidth, mDefaultStrokeColor);            selector.addState(new int[]{}, defaultShape);            return selector;        }        private GradientDrawable getItemShape(int shape, int cornerRadius,                                              int solidColor, int strokeWidth, int strokeColor) {            GradientDrawable drawable = new GradientDrawable();            drawable.setShape(shape);            drawable.setStroke(strokeWidth, strokeColor);            drawable.setCornerRadius(cornerRadius);            drawable.setColor(solidColor);            return drawable;        }    }    public static ColorSelector newColorSelector() {        return new ColorSelector();    }    public static final class ColorSelector {        private int mDefaultColor;        private int mDisabledColor;        private int mPressedColor;        private int mSelectedColor;        private int mFocusedColor;        private boolean hasSetDisabledColor = false;        private boolean hasSetPressedColor = false;        private boolean hasSetSelectedColor = false;        private boolean hasSetFocusedColor = false;        private ColorSelector() {            mDefaultColor = Color.BLACK;            mDisabledColor = Color.GRAY;            mPressedColor = Color.BLACK;            mSelectedColor = Color.BLACK;            mFocusedColor = Color.BLACK;        }        public ColorSelector setDefaultColor(@ColorInt int color) {            mDefaultColor = color;            if (!hasSetDisabledColor)                mDisabledColor = color;            if (!hasSetPressedColor)                mPressedColor = color;            if (!hasSetSelectedColor)                mSelectedColor = color;            if (!hasSetFocusedColor)                mFocusedColor = color;            return this;        }        public ColorSelector setDisabledColor(@ColorInt int color) {            mDisabledColor = color;            hasSetDisabledColor = true;            return this;        }        public ColorSelector setPressedColor(@ColorInt int color) {            mPressedColor = color;            hasSetPressedColor = true;            return this;        }        public ColorSelector setSelectedColor(@ColorInt int color) {            mSelectedColor = color;            hasSetSelectedColor = true;            return this;        }        public ColorSelector setFocusedColor(@ColorInt int color) {            mFocusedColor = color;            hasSetFocusedColor = true;            return this;        }        public ColorStateList create() {            int[] colors = new int[]{                    hasSetDisabledColor ? mDisabledColor : mDefaultColor,                    hasSetPressedColor ? mPressedColor : mDefaultColor,                    hasSetSelectedColor ? mSelectedColor : mDefaultColor,                    hasSetFocusedColor ? mFocusedColor : mDefaultColor,                    mDefaultColor            };            int[][] states = new int[5][];            states[0] = new int[]{-android.R.attr.state_enabled};            states[1] = new int[]{android.R.attr.state_pressed};            states[2] = new int[]{android.R.attr.state_selected};            states[3] = new int[]{android.R.attr.state_focused};            states[4] = new int[]{};            return new ColorStateList(states, colors);        }    }    public static GeneralSelector newGeneralSelector() {        return new GeneralSelector();    }    public static final class GeneralSelector {        private Drawable mDefaultDrawable;        private Drawable mDisabledDrawable;        private Drawable mPressedDrawable;        private Drawable mSelectedDrawable;        private Drawable mFocusedDrawable;        private boolean hasSetDisabledDrawable = false;        private boolean hasSetPressedDrawable = false;        private boolean hasSetSelectedDrawable = false;        private boolean hasSetFocusedDrawable = false;        private GeneralSelector() {            mDefaultDrawable = new ColorDrawable(Color.TRANSPARENT);        }        public GeneralSelector setDefaultDrawable(Drawable drawable) {            mDefaultDrawable = drawable;            if (!hasSetDisabledDrawable)                mDisabledDrawable = drawable;            if (!hasSetPressedDrawable)                mPressedDrawable = drawable;            if (!hasSetSelectedDrawable)                mSelectedDrawable = drawable;            if (!hasSetFocusedDrawable)                mFocusedDrawable = drawable;            return this;        }        public GeneralSelector setDisabledDrawable(Drawable drawable) {            mDisabledDrawable = drawable;            hasSetDisabledDrawable = true;            return this;        }        public GeneralSelector setPressedDrawable(Drawable drawable) {            mPressedDrawable = drawable;            hasSetPressedDrawable = true;            return this;        }        public GeneralSelector setSelectedDrawable(Drawable drawable) {            mSelectedDrawable = drawable;            hasSetSelectedDrawable = true;            return this;        }        public GeneralSelector setFocusedDrawable(Drawable drawable) {            mFocusedDrawable = drawable;            hasSetFocusedDrawable = true;            return this;        }        public StateListDrawable create() {            StateListDrawable selector = new StateListDrawable();            if (hasSetDisabledDrawable)                selector.addState(new int[]{-android.R.attr.state_enabled}, mDisabledDrawable);            if (hasSetPressedDrawable)                selector.addState(new int[]{android.R.attr.state_pressed}, mPressedDrawable);            if (hasSetSelectedDrawable)                selector.addState(new int[]{android.R.attr.state_selected}, mSelectedDrawable);            if (hasSetFocusedDrawable)                selector.addState(new int[]{android.R.attr.state_focused}, mFocusedDrawable);            selector.addState(new int[]{}, mDefaultDrawable);            return selector;        }        //overload        public GeneralSelector setDefaultDrawable(Context context, @DrawableRes int drawableRes) {            return setDefaultDrawable(ContextCompat.getDrawable(context, drawableRes));        }        //overload        public GeneralSelector setDisabledDrawable(Context context, @DrawableRes int drawableRes) {            return setDisabledDrawable(ContextCompat.getDrawable(context, drawableRes));        }        //overload        public GeneralSelector setPressedDrawable(Context context, @DrawableRes int drawableRes) {            return setPressedDrawable(ContextCompat.getDrawable(context, drawableRes));        }        //overload        public GeneralSelector setSelectedDrawable(Context context, @DrawableRes int drawableRes) {            return setSelectedDrawable(ContextCompat.getDrawable(context, drawableRes));        }        //overload        public GeneralSelector setFocusedDrawable(Context context, @DrawableRes int drawableRes) {            return setFocusedDrawable(ContextCompat.getDrawable(context, drawableRes));        }    }}

使用方法如下:

et1.setBackground(SelectorFactory.newShapeSelector()            .setDefaultStrokeColor(Color.GRAY)            .setFocusedStrokeColor(Color.YELLOW)            .setStrokeWidth(2)            .create());    et2.setBackground(SelectorFactory.newShapeSelector()            .setDefaultStrokeColor(Color.GRAY)            .setFocusedStrokeColor(Color.YELLOW)            .setStrokeWidth(2)            .setCornerRadius(20)            .create());    et3.setBackground(SelectorFactory.newShapeSelector()            .setDefaultStrokeColor(Color.GRAY)            .setFocusedStrokeColor(Color.RED)            .setStrokeWidth(2)            .create());    et1.setHintTextColor(SelectorFactory.newColorSelector()            .setDefaultColor(Color.GRAY)            .setFocusedColor(Color.BLACK)            .create());    et2.setHintTextColor(SelectorFactory.newColorSelector()            .setDefaultColor(Color.GRAY)            .setFocusedColor(Color.BLACK)            .create());    et3.setHintTextColor(SelectorFactory.newColorSelector()            .setDefaultColor(Color.GRAY)            .setFocusedColor(Color.BLACK)            .create());    et1.setTextColor(SelectorFactory.newColorSelector()            .setDefaultColor(Color.BLACK)            .setFocusedColor(Color.YELLOW)            .create());    et2.setTextColor(SelectorFactory.newColorSelector()            .setDefaultColor(Color.BLACK)            .setFocusedColor(Color.YELLOW)            .create());    et3.setTextColor(SelectorFactory.newColorSelector()            .setDefaultColor(Color.BLACK)            .setFocusedColor(Color.RED)            .create());

效果如下图:
这里写图片描述

btn1.setBackground(SelectorFactory.newGeneralSelector()            .setDefaultDrawable(ContextCompat.getDrawable(this, R.mipmap.blue_primary))            .setPressedDrawable(this, R.mipmap.blue_primary_dark)            .create());    btn2.setBackground(SelectorFactory.newShapeSelector()            .setDefaultBgColor(ContextCompat.getColor(this, android.R.color.holo_blue_light))            .setPressedBgColor(ContextCompat.getColor(this, android.R.color.holo_blue_dark))            .create());    btn3.setBackground(SelectorFactory.newShapeSelector()            .setDefaultBgColor(ContextCompat.getColor(this, android.R.color.holo_blue_light))            .setPressedBgColor(ContextCompat.getColor(this, android.R.color.holo_blue_dark))            .setSelectedBgColor(ContextCompat.getColor(this, android.R.color.holo_blue_dark))            .setCornerRadius(20)            .create());    btn3.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            btn3.setSelected(!btn3.isSelected());        }    });    btn4.setBackground(SelectorFactory.newShapeSelector()            .setDefaultBgColor(ContextCompat.getColor(this, android.R.color.holo_blue_light))            .setPressedBgColor(ContextCompat.getColor(this, android.R.color.holo_blue_dark))            .setDisabledBgColor(Color.GRAY)            .create());    btn4.setEnabled(false);

这里写图片描述

tv1.setBackground(SelectorFactory.newShapeSelector()            .setDefaultStrokeColor(Color.GRAY)            .setStrokeWidth(1)            .setCornerRadius(20)            .create());    tv2.setTextColor(SelectorFactory.newColorSelector()            .setDefaultColor(Color.BLACK)            .setPressedColor(Color.YELLOW)            .create());    tv3.setTextColor(SelectorFactory.newColorSelector()            .setDefaultColor(Color.BLACK)            .setSelectedColor(Color.YELLOW)            .create());    tv3.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            tv3.setSelected(!tv3.isSelected());        }    });    tv4.setTextColor(SelectorFactory.newColorSelector()            .setDefaultColor(Color.BLACK)            .setSelectedColor(Color.YELLOW)            .setDisabledColor(Color.GRAY)            .create());    tv4.setEnabled(false);

这里写图片描述
使用捷径
有人可能会说:虽然是可以不用再定义很多的xml文件了,但是一个页面有很多的view,我不是要对每个view都是挨个设置一下背景嘛,这岂不更麻烦。
——简单,我们自定义一个View继承一下原有的View,再自定义一些属性,然后在构造方法里面拿到这些属性,用我们的工具类给他设置上不就行了嘛,这样是需要再写布局的时候写一下属性就行了。