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,再自定义一些属性,然后在构造方法里面拿到这些属性,用我们的工具类给他设置上不就行了嘛,这样是需要再写布局的时候写一下属性就行了。
阅读全文
0 0
- selector+shape使用工具类
- shape、selector的使用
- shape selector一起使用
- shape、selector的使用
- Selector里面使用shape
- selector+shape结合使用
- shape和selector的 使用
- shape layer-list selector使用
- 使用Button特效 selector+shape
- 使用Button特效 selector+shape
- Android shape、selector的使用
- selector,shape的自定义使用
- shape和selector的使用
- selector和shape结合使用
- Android:shape和selector使用
- android selector中使用shape
- selector+shape
- shape/selector
- JavaScript中ajax的使用
- liunx docker 安装 zookeeper
- [BZOJ2742]-[HEOI2012]Akai的数学作业-画柿子
- 设计模式---代理模式
- 位置型PID算法
- selector+shape使用工具类
- clear、clc、close的区别
- Eclipse 导入activiti包里的 activiti-webapp-explorer2 项目
- 带复制粘贴的底部输入框
- Java中23种设计模式详解
- Java 多线程编程设计模式 Active Object
- 分布式实时日志分析解决方案ELK部署架构
- decimal(C# 参考)
- Python基础原理:FP-growth算法的构建