package cn.mutils.app.ui; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.graphics.RectF; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.View; import cn.mutils.app.util.AppUtil; @SuppressWarnings({"UnnecessaryInterfaceModifier", "unused"}) public class SwitchButton extends View { public static interface OnCheckedChangeListener { boolean onCheckedChanging(SwitchButton v, boolean checked); void onCheckedChanged(SwitchButton v, boolean checked); } protected int mChromeColor = 0xFF4DD963; protected int mBorderColor = 0xFFDADADA; protected Paint mPaint = new Paint(); protected Path mPath = new Path(); protected RectF mRect = new RectF(); protected boolean mChecked; protected int mPadding; protected int mWrapContentWidth; protected int mWrapContentHeight; protected OnCheckedChangeListener mListener; public SwitchButton(Context context) { super(context); init(context, null); } public SwitchButton(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs); } public SwitchButton(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context, attrs); } protected void init(Context context, AttributeSet attrs) { DisplayMetrics metrics = AppUtil.getDisplayMetrics(context); mWrapContentWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 46, metrics); mWrapContentHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 26, metrics); mPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2, metrics); int minWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 48, metrics); this.setMinimumWidth(minWidth); int minHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24, metrics); this.setMinimumHeight(minHeight); super.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mListener != null) { if (mListener.onCheckedChanging((SwitchButton) v, mChecked)) { setChecked(!mChecked); } } else { setChecked(!mChecked); } } }); } @Override protected void onDraw(Canvas canvas) { int w = this.getWidth(); int h = this.getHeight(); int padding2 = mPadding << 1; int r = (int) ((w - 4 - padding2) * 0.295); int r2 = r << 1; int offsetX = mPadding; int offsetY = mPadding + ((h - padding2) >> 1) - r - 1; mPath.reset(); mPath.moveTo(offsetX + r + 1, offsetY); mPath.lineTo(w - r - 1 - offsetX, offsetY); mRect.set(w - r2 - 2 - offsetX, offsetY, w - offsetX, offsetY + r2 + 2); mPath.arcTo(mRect, 270, 180); mPath.lineTo(offsetX + r + 1, offsetY + r2 + 2); mRect.set(offsetX, offsetY, offsetX + r2 + 2, offsetY + r2 + 2); mPath.arcTo(mRect, 90, 180); mPath.close(); mPaint.reset(); mPaint.setAntiAlias(true); if (mChecked) { mPaint.setStyle(Paint.Style.FILL); mPaint.setColor(mChromeColor); canvas.drawPath(mPath, mPaint); int circleX = w - r - 1 - offsetX; int circleY = offsetY + r + 1; mPaint.setStyle(Paint.Style.FILL); mPaint.setColor(0xFFFFFFFF); canvas.drawCircle(circleX, circleY, r, mPaint); } else { mPaint.setStyle(Paint.Style.FILL); mPaint.setColor(0xFFFFFFFF); canvas.drawPath(mPath, mPaint); mPaint.setStyle(Paint.Style.STROKE); mPaint.setColor(mBorderColor); mPaint.setStrokeWidth(1); canvas.drawPath(mPath, mPaint); int circleX = offsetX + r + 1; int circleY = offsetY + r + 1; mPaint.setStyle(Paint.Style.FILL); mPaint.setColor(0xFFFFFFFF); canvas.drawCircle(circleX, circleY, r, mPaint); mPaint.setStyle(Paint.Style.STROKE); mPaint.setColor(mBorderColor); mPaint.setStrokeWidth(1); canvas.drawCircle(circleX, circleY, r, mPaint); } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.AT_MOST) { widthMeasureSpec = MeasureSpec.makeMeasureSpec(mWrapContentWidth, MeasureSpec.EXACTLY); } if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST) { heightMeasureSpec = MeasureSpec.makeMeasureSpec(mWrapContentHeight, MeasureSpec.EXACTLY); } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } public boolean isChecked() { return mChecked; } public void setChecked(boolean checked) { mChecked = checked; invalidate(); if (mListener != null) { mListener.onCheckedChanged(SwitchButton.this, mChecked); } } public int getChromeColor() { return mChromeColor; } public void setChromeColor(int chromeColor) { mChromeColor = chromeColor; invalidate(); } public int getBorderColor() { return mBorderColor; } public void setBorderColor(int borderColor) { mBorderColor = borderColor; invalidate(); } @Override public void setOnClickListener(OnClickListener l) { throw new IllegalArgumentException("You can not call this method"); } public void setOnCheckedChangeListener(OnCheckedChangeListener listener) { mListener = listener; } }