您当前的位置: 首页 >  android

Kevin-Dev

暂无认证

  • 2浏览

    0关注

    544博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Android 自定义 View】--> Android「多开关 MultiSwitch」控件

Kevin-Dev 发布时间:2020-01-09 23:22:06 ,浏览量:2

不断学习,做更好的自己!💪

视频号CSDN简书欢迎打开微信,关注我的视频号:KevinDev点我点我 效果图

01.png

代码 1. attr.xml


    
        
        
        
        
        
        
        
        
        
        
            
            
        
        
            
            
        
    

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;
    }
}
关注
打赏
1658837700
查看更多评论
立即登录/注册

微信扫码登录

0.0795s