不断学习,做更好的自己!💪
视频号CSDN简书欢迎打开微信,关注我的视频号:KevinDev点我点我 效果图
2. 自定义 View
MultiSwitch.java
/**
* Created on 2021/7/16 13:44
* 1. 多个Item
* 2. 支持文字和Icon
* 3. 过度动画
* 4. 支持设置大小
* 5. 支持滑动和点击
* 6. 支持椭圆或者圆角矩形
* @author Gong Youqiang
*/
public class MultiSwitch extends View {
public static final String TAG = "MultiSwitch";
/**
* 形状
* 1. 圆角矩形
* 2. 两端是圆形
*/
enum SwitchShape {
RECT,
OVAl
}
/**
* 类型
* 1. 文本
* 2. 图标
*/
enum SwitchType {
TEXT,
ICON
}
// 默认大小
public static final int DEFAULT_WIDTH = DisplayUtils.dpToPx(112);
public static final int DEFAULT_HEIGHT = DisplayUtils.dpToPx(56);
public static final int CORNER_RADIUS = DisplayUtils.dpToPx(4);
// 类型
private SwitchType mType;
// 图标资源
private int[] mIconRes;
// 文本内容
private String[] mItems;
// 内容数量
private int mItemCount;
// 内容的横向坐标
private int[] mItemCoordinate;
private int top, bottom;
private SwitchShape mShape;
// 背景色
private int mBgColor;
// 背景文本 Or Icon 颜色
private int mBgTextColor;
// 滑块颜色
private int mThumbColor;
// 滑块上文本 or Icon 颜色
private int mThumbTextColor;
// 一个Item所占的长和宽
private int mWidth;
private int mHeight;
private int mAveWidth;
// 文本大小
private int mTextSize;
// 图标大小
private int mIconSize;
// 边框大小
private int mThumbBorderWidth;
private Paint mBgColorPaint;
private Paint mBgTextPaint;
private Paint mThumbColorPaint;
private Paint mThumbTextPaint;
private Paint mThumbBorderPaint;
// 当前滑块的状态
private ThumbState mThumbState;
private int mThumbMargin;
// 动画
private ValueAnimator mValueAnimator;
private boolean canSelect = true;
// 点击时间
private long pressTime;
private MultiSwitchListener mListener;
public MultiSwitch(Context context) {
this(context, null);
}
public MultiSwitch(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public MultiSwitch(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
/**
* 1. 获取必要的属性
* 2. 初始化一些必要的参数,比如说画笔
*/
private void init(Context context, AttributeSet attrs) {
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MultiSwitch);
mBgColor = typedArray.getColor(R.styleable.MultiSwitch_msBackgroundColor, getResources().getColor(R.color.textSecond));
mBgTextColor = typedArray.getColor(R.styleable.MultiSwitch_msNormalTextColor, getResources().getColor(R.color.textPrimary));
mThumbColor = typedArray.getColor(R.styleable.MultiSwitch_msThumbColor, getResources().getColor(R.color.colorPrimary));
mThumbTextColor = typedArray.getColor(R.styleable.MultiSwitch_msThumbTextColor, getResources().getColor(R.color.white));
mTextSize = typedArray.getDimensionPixelSize(R.styleable.MultiSwitch_msTextSize, DisplayUtils.sp2px(context, 20));
mIconSize = typedArray.getDimensionPixelSize(R.styleable.MultiSwitch_msIconSize, DisplayUtils.dip2px(context, 24));
mType = SwitchType.values()[typedArray.getInt(R.styleable.MultiSwitch_msType, SwitchType.TEXT.ordinal())];
mShape = SwitchShape.values()[typedArray.getInt(R.styleable.MultiSwitch_msShape, SwitchShape.RECT.ordinal())];
mThumbMargin = typedArray.getDimensionPixelOffset(R.styleable.MultiSwitch_msThumbMargin, DisplayUtils.dip2px(2));
mThumbBorderWidth = typedArray.getDimensionPixelOffset(R.styleable.MultiSwitch_msThumbBorderWidth, DisplayUtils.dip2px(0));
int thumbBorderColor = typedArray.getColor(R.styleable.MultiSwitch_msThumbBorderColor, getResources().getColor(R.color.white));
// TODO 设置默认位置
// 初始化画笔
mBgColorPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
mBgColorPaint.setColor(mBgColor);
mBgTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
mBgTextPaint.setTextSize(mTextSize);
mBgTextPaint.setColor(mBgTextColor);
mThumbColorPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
mThumbColorPaint.setColor(mThumbColor);
mThumbBorderPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
mThumbBorderPaint.setStyle(Paint.Style.STROKE);
mThumbBorderPaint.setStrokeWidth(mThumbBorderWidth);
mThumbBorderPaint.setColor(thumbBorderColor);
mThumbTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
mThumbTextPaint.setTextSize(mTextSize);
mThumbTextPaint.setColor(mThumbTextColor);
// 初始化滑块状态
mThumbState = new ThumbState(0, 0);
}
/**
* 设置监听器
*/
public void setMultiSwitchListener(MultiSwitchListener listener) {
this.mListener = listener;
}
/**
* 设置选择项内容
*/
public void setItemsArray(String[] items) {
if (items == null || items.length = mItemCount)
pos = mItemCount - 1;
else if(pos = mItemCoordinate[pos + 1]) {
pos++;
mThumbState.offset -= (mItemCoordinate[pos] - mItemCoordinate[pos - 1]);
}
} else {
while (pos != 0 && mItemCoordinate[pos] + mThumbState.offset mAveWidth / 2) {
if (mThumbState.offset > 0) {
targetPos = mThumbState.pos + 1;
}
if (mThumbState.offset
SwitchActivity.java
public class SwitchActivity extends BaseActivity {
public static final String TAG = "CouponActivity";
@BindView(R.id.ms_content)
MultiSwitch mSwitch;
@BindView(R.id.ms_icon)
MultiSwitch mIconSwitch;
@BindView(R.id.ms_weak)
MultiSwitch mWeekSwitch;
@BindView(R.id.ms_check)
MultiSwitch mCheckSwitch;
@Override
public int getLayoutId() {
return R.layout.activity_switch;
}
@Override
public void initView() {
mSwitch.setItemsArray(new String[]{"Android", "Ios", "Java"});
mSwitch.setCurrentItem(2);
mSwitch.setMultiSwitchListener(new MultiSwitchListener() {
@Override
public void onPositionSelected(int pos) {
Log.e(TAG, "位置:" + pos);
}
@Override
public void onPositionOffsetPercent(int pos, float percent) {
Log.e(TAG, "位置:" + pos + ",百分比:" + percent);
}
});
mIconSwitch.setIconArray(new int[]{R.mipmap.ic_apple, R.mipmap.ic_banana, R.mipmap.ic_cherry});
mWeekSwitch.setItemsArray(new String[]{"一", "二", "三", "四", "五", "六", "日"});
mCheckSwitch.setItemsArray(new String[]{"是", "否"});
}
}
4. 工具类
public class DisplayUtils {
public static int dpToPx(int dp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, Resources.getSystem().getDisplayMetrics());
}
public static int pxToDp(float px) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, px, Resources.getSystem().getDisplayMetrics());
}
public static int getViewMeasuredHeight(TextView tv) {
tv.measure(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
return tv.getMeasuredHeight();
}
/**
* dp转px
*/
public static int dip2px(Context context, float dpValue) {
float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* dp转px
*/
public static int dip2px(float dpValue) {
float scale = Resources.getSystem().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 将px值转换为sp值,保证文字大小不变
*/
public static int px2sp(Context context, float pxValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / fontScale + 0.5f);
}
/**
* 将sp值转换为px值,保证文字大小不变
*/
public static int sp2px(Context context, float spValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
public static boolean hasEmpty(List edits) {
for (TextView editText : edits) {
if (TextUtils.isEmpty(editText.getText().toString().trim())) {
return true;
}
}
return false;
}
public static boolean hasEmpty(TextView... edits) {
for (TextView editText : edits) {
if (TextUtils.isEmpty(editText.getText().toString().trim())) {
return true;
}
}
return false;
}
public static boolean hasEmpty(ImageView[] edits) {
for (ImageView imageView : edits) {
if (TextUtils.isEmpty(imageView.getTag().toString().trim())) {
return true;
}
}
return false;
}
public static View inflaterLayout(Context context, @LayoutRes int layoutRes) {
LayoutInflater inflater = LayoutInflater.from(context);
return inflater.inflate(layoutRes, null);
}
/**
* 圆角Drawable
*
* @param radius 圆角
* @param color 填充颜色
*/
public static GradientDrawable getShapeDrawable(int radius, @ColorInt int color) {
GradientDrawable gd = new GradientDrawable();
gd.setColor(color);
gd.setCornerRadius(radius);
return gd;
}
}