package com.marshalchen.common.uimodule.switchbutton;
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
/**
* class for configuring the Switchbutton
* used when you want to change the face of this view in code
*
* @author kyleduo
* @since 2014-09-24
*/
public class Configuration implements Cloneable {
static class Default {
static int DEFAULT_OFF_COLOR = Color.parseColor("#E3E3E3");
static int DEFAULT_ON_COLOR = Color.parseColor("#02BFE7");
static int DEFAULT_THUMB_COLOR = Color.parseColor("#FFFFFF");
static int DEFAULT_THUMB_PRESSED_COLOR = Color.parseColor("#0090EE");
static int DEFAULT_THUMB_MARGIN = 2;
static int DEFAULT_RADIUS = 999;
static float DEFAULT_MEASURE_FACTOR = 2f;
static int DEFAULT_INNER_BOUNDS = 0;
}
static class Limit {
static int MIN_THUMB_SIZE = 24;
}
/**
* drawable of background
*/
private Drawable mOnDrawable = null, mOffDrawable = null;
/**
* drawable of thumb
*/
private Drawable mThumbDrawable = null;
private int mOnColor = Default.DEFAULT_ON_COLOR, mOffColor = Default.DEFAULT_OFF_COLOR, mThumbColor = Default.DEFAULT_THUMB_COLOR;
/**
* space between View's border and thumb
*/
private int mThumbMarginTop = 0, mThumbMarginBottom = 0, mThumbMarginLeft = 0, mThumbMarginRight = 0;
private int mThumbWidth = -1, mThumbHeight = -1;
private float density;
private int mVelocity = -1;
private float mRadius = -1;
/**
* factor limit the minimum width equals almost (the height of thumb * measureFactor)
*/
private float mMeasureFactor = 0;
/**
* inner bounds
*/
private Rect mInsetBounds;
private Configuration() {
};
public static Configuration getDefault(float density) {
Configuration defaultConfiguration = new Configuration();
defaultConfiguration.density = density;
defaultConfiguration.setThumbMarginInPixel(defaultConfiguration.getDefaultThumbMarginInPixel());
defaultConfiguration.mInsetBounds = new Rect(Default.DEFAULT_INNER_BOUNDS, Default.DEFAULT_INNER_BOUNDS, Default.DEFAULT_INNER_BOUNDS, Default.DEFAULT_INNER_BOUNDS);
return defaultConfiguration;
}
public void setBackDrawable(Drawable offDrawable, Drawable onDrawable) {
if (onDrawable == null && offDrawable == null) {
throw new IllegalArgumentException("back drawable can not be null");
}
if (offDrawable != null) {
mOffDrawable = offDrawable;
if (onDrawable != null) {
mOnDrawable = onDrawable;
} else {
mOnDrawable = mOffDrawable;
}
}
}
void setOffDrawable(Drawable offDrawable) {
if (offDrawable == null) {
throw new IllegalArgumentException("off drawable can not be null");
}
mOffDrawable = offDrawable;
}
void setOnDrawable(Drawable onDrawable) {
if (onDrawable == null) {
throw new IllegalArgumentException("on drawable can not be null");
}
mOnDrawable = onDrawable;
}
public Drawable getOnDrawable() {
return mOnDrawable;
}
public Drawable getOffDrawable() {
return mOffDrawable;
}
public void setThumbDrawable(Drawable thumbDrawable) {
if (thumbDrawable == null) {
throw new IllegalArgumentException("thumb drawable can not be null");
}
mThumbDrawable = thumbDrawable;
}
public Drawable getThumbDrawable() {
return mThumbDrawable;
}
public void setThumbMargin(int top, int bottom, int left, int right) {
mThumbMarginTop = (int) (top * density);
mThumbMarginBottom = (int) (bottom * density);
mThumbMarginLeft = (int) (left * density);
mThumbMarginRight = (int) (right * density);
}
public void setThumbMarginInPixel(int top, int bottom, int left, int right) {
mThumbMarginTop = top;
mThumbMarginBottom = bottom;
mThumbMarginLeft = left;
mThumbMarginRight = right;
}
public void setThumbMargin(int top, int bottom, int leftAndRight) {
setThumbMargin(top, bottom, leftAndRight, leftAndRight);
}
public void setThumbMargin(int topAndBottom, int leftAndRight) {
setThumbMargin(topAndBottom, topAndBottom, leftAndRight, leftAndRight);
}
public void setThumbMargin(int margin) {
setThumbMargin(margin, margin, margin, margin);
}
public void setThumbMarginInPixel(int marginInPixel) {
setThumbMarginInPixel(marginInPixel, marginInPixel, marginInPixel, marginInPixel);
}
public int getDefaultThumbMarginInPixel() {
return (int) (Default.DEFAULT_THUMB_MARGIN * density);
}
public int getThumbMarginTop() {
return mThumbMarginTop;
}
public int getThumbMarginBottom() {
return mThumbMarginBottom;
}
public int getThumbMarginLeft() {
return mThumbMarginLeft;
}
public int getThumbMarginRight() {
return mThumbMarginRight;
}
public float getDensity() {
return density;
}
public void setRadius(float radius) {
this.mRadius = radius;
}
public float getRadius() {
if (this.mRadius < 0) {
return Default.DEFAULT_RADIUS;
}
return this.mRadius;
}
/**
* set velocity of animation
* @param velocity pixel moved per frame (in linear)
*/
public void setVelocity(int velocity) {
this.mVelocity = velocity;
}
public int getVelocity() {
return mVelocity;
}
public void setOnColor(int onColor) {
this.mOnColor = onColor;
}
public int getOnColor(int onColor) {
return mOnColor;
}
public void setOffColor(int offColor) {
this.mOffColor = offColor;
}
public int getOffColor() {
return mOffColor;
}
public void setThumbColor(int thumbColor) {
this.mThumbColor = thumbColor;
}
public int getThumbColor() {
return mThumbColor;
}
public void setThumbWidthAndHeightInPixel(int width, int height) {
if (width > 0) {
mThumbWidth = width;
}
if (height > 0) {
mThumbHeight = height;
}
}
public void setThumbWidthAndHeight(int width, int height) {
setThumbWidthAndHeightInPixel((int) (width * density), (int) (height * density));
}
public Drawable getOffDrawableWithFix() {
if (mOffDrawable != null) {
return mOffDrawable;
} else {
return getDrawableFromColor(mOffColor);
}
}
public Drawable getOnDrawableWithFix() {
if (mOnDrawable != null) {
return mOnDrawable;
} else {
return getDrawableFromColor(mOnColor);
}
}
public Drawable getThumbDrawableWithFix() {
if (mThumbDrawable != null) {
return mThumbDrawable;
} else {
return getDrawableFromColor(mThumbColor);
}
}
public float getMeasureFactor() {
if (mMeasureFactor <= 0) {
mMeasureFactor = Default.DEFAULT_MEASURE_FACTOR;
}
return mMeasureFactor;
}
public void setMeasureFactor(float measureFactor) {
if (measureFactor <= 0) {
this.mMeasureFactor = Default.DEFAULT_MEASURE_FACTOR;
}
this.mMeasureFactor = measureFactor;
}
public Rect getInsetBounds() {
return this.mInsetBounds;
}
public void setInsetBounds(int left, int top, int right, int bottom) {
setInsetLeft(left);
setInsetTop(top);
setInsetRight(right);
setInsetBottom(bottom);
}
public void setInsetLeft(int left) {
if (left > 0) {
left = -left;
}
this.mInsetBounds.left = left;
}
public void setInsetTop(int top) {
if (top > 0) {
top = -top;
}
this.mInsetBounds.top = top;
}
public void setInsetRight(int right) {
if (right > 0) {
right = -right;
}
this.mInsetBounds.right = right;
}
public void setInsetBottom(int bottom) {
if (bottom > 0) {
bottom = -bottom;
}
this.mInsetBounds.bottom = bottom;
}
public int getInsetX() {
return getShrinkX() / 2;
}
public int getInsetY() {
return getShrinkY() / 2;
}
public int getShrinkX() {
return this.mInsetBounds.left + this.mInsetBounds.right;
}
public int getShrinkY() {
return this.mInsetBounds.top + this.mInsetBounds.bottom;
}
public boolean needShrink() {
return this.mInsetBounds.left + this.mInsetBounds.right + this.mInsetBounds.top + this.mInsetBounds.bottom != 0;
}
/**
* usd for get drawable from color
*
* @param color
* @return
*/
private Drawable getDrawableFromColor(int color) {
GradientDrawable tempDrawable = new GradientDrawable();
tempDrawable.setCornerRadius(this.getRadius());
tempDrawable.setColor(color);
return tempDrawable;
}
int getThumbWidth() {
int width = mThumbWidth;
if (width < 0) {
if (mThumbDrawable != null) {
width = mThumbDrawable.getIntrinsicWidth();
if (width > 0) {
return width;
}
}
if (density <= 0) {
throw new IllegalArgumentException("density must be a positive number");
}
width = (int) (Limit.MIN_THUMB_SIZE * density);
}
return width;
}
int getThumbHeight() {
int height = mThumbHeight;
if (height < 0) {
if (mThumbDrawable != null) {
height = mThumbDrawable.getIntrinsicHeight();
if (height > 0) {
return height;
}
}
if (density <= 0) {
throw new IllegalArgumentException("density must be a positive number");
}
height = (int) (Limit.MIN_THUMB_SIZE * density);
}
return height;
}
}