package org.auie.ui; import org.auie.utils.UEMethod; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.PaintFlagsDrawFilter; import android.graphics.RectF; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.ViewGroup.LayoutParams; import android.view.ViewTreeObserver.OnPreDrawListener; import android.view.WindowManager; @SuppressLint("NewApi") public class UISwitchButton extends View implements OnTouchListener{ public static final int TYPE_POINT = 0; public static final int TYPE_ROUND = 1; public static final boolean OFF = false; public static final boolean ON = true; private int DP = 0; private int HEIGHT = 0; private Paint mPaint = new Paint(); private boolean status = OFF; private int type = TYPE_POINT; private int statusFalseColor = 0xFFFF3366; private int statusTrueColor = 0x88FFFFFF; private OnUISwitchChangeListener switchChangeListener; public UISwitchButton(Context context) { super(context); init(); } public UISwitchButton(Context context, AttributeSet attrs) { super(context, attrs); init(); } public UISwitchButton(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } public UISwitchButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(); } @SuppressLint("ClickableViewAccessibility") @SuppressWarnings("deprecation") public void init(){ setOnTouchListener(this); HEIGHT = ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getHeight(); getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener() { @Override public boolean onPreDraw() { DP = UEMethod.dp2px(getContext(), 1); LayoutParams params = getLayoutParams(); if (getHeight() >= HEIGHT - DP * 72) { params.height = 30 * DP; } params.width = (int) (params.height * 2.5); setLayoutParams(params); getViewTreeObserver().removeOnPreDrawListener(this); return false; } }); } public boolean getStatus() { return status; } public void setStatus(boolean status) { this.status = status; invalidate(); } @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouch(View v, MotionEvent event) { setStatus(!status); if (switchChangeListener != null) { switchChangeListener.onSwitchChanged(v, status); } return false; } @SuppressLint("DrawAllocation") @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); mPaint.setAntiAlias(true); canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG| Paint.FILTER_BITMAP_FLAG)); switch (type) { case TYPE_ROUND: if (status) { mPaint.setColor(Color.parseColor("#C8C8C8")); mPaint.setStrokeWidth(1.8f); mPaint.setStyle(Style.STROKE); canvas.drawRoundRect(new RectF(DP, DP, getWidth() - DP, getHeight() - DP), getHeight()/2, getHeight()/2, mPaint); mPaint.setColor(Color.parseColor("#E8E8E8")); mPaint.setStyle(Style.FILL); canvas.drawRoundRect(new RectF(1.6f * DP, 1.6f * DP, getWidth() - 1.6f * DP, getHeight() - 1.6f * DP), (getHeight() - DP)/2f, (getHeight() - DP)/2f, mPaint); mPaint.setColor(Color.parseColor("#C8C8C8")); mPaint.setStrokeWidth(2f); mPaint.setStyle(Style.FILL); canvas.drawCircle(getWidth() - getHeight()/2, getHeight()/2, getHeight()/2 - 2.8f * DP, mPaint); mPaint.setColor(Color.parseColor("#FFFFFF")); mPaint.setStyle(Style.FILL); canvas.drawCircle(getWidth() - getHeight()/2, getHeight()/2, getHeight()/2 - 3.4f * DP, mPaint); }else { mPaint.setColor(Color.parseColor("#C8C8C8")); mPaint.setStrokeWidth(1.8f); mPaint.setStyle(Style.STROKE); canvas.drawRoundRect(new RectF(DP, DP, getWidth() - DP, getHeight() - DP), getHeight()/2, getHeight()/2, mPaint); mPaint.setColor(Color.parseColor("#FDFDFD")); mPaint.setStyle(Style.FILL); canvas.drawRoundRect(new RectF(2 * DP, 2 * DP, getWidth() - 2 * DP, getHeight() - 2 * DP), (getHeight() - DP)/2, (getHeight() - DP)/2, mPaint); mPaint.setColor(Color.parseColor("#C8C8C8")); mPaint.setStrokeWidth(2f); mPaint.setStyle(Style.STROKE); canvas.drawCircle(getHeight()/2 + 0.5f * DP, getHeight()/2, getHeight()/2 - 2.8f * DP, mPaint); mPaint.setColor(Color.parseColor("#D8D8D8")); mPaint.setStyle(Style.FILL); canvas.drawCircle(getHeight()/2 + 0.5f * DP, getHeight()/2, getHeight()/2 - 3.4f * DP, mPaint); } break; default: mPaint.setStrokeWidth(1.8f); mPaint.setStyle(Style.STROKE); if (status) { mPaint.setColor(statusTrueColor); canvas.drawLine(4 * DP, getHeight()/2, getWidth() - getHeight() + 4 * DP, getHeight()/2, mPaint); canvas.drawCircle(getWidth() - getHeight()/2, getHeight()/2, getHeight()/2 - 4 * DP, mPaint); mPaint.setColor(statusTrueColor); mPaint.setStyle(Style.FILL); canvas.drawCircle(getWidth() - getHeight()/2, getHeight()/2, getHeight()/2 - 4.8f * DP, mPaint); mPaint.setColor(statusFalseColor); }else { mPaint.setColor(statusTrueColor); canvas.drawLine(getHeight() - 4 * DP, getHeight()/2, getWidth() - 4 * DP, getHeight()/2, mPaint); canvas.drawCircle(getHeight()/2, getHeight()/2, getHeight()/2 - 4 * DP, mPaint); mPaint.setColor(statusFalseColor); mPaint.setStyle(Style.FILL); canvas.drawCircle(getHeight()/2, getHeight()/2, getHeight()/2 - 4.8f * DP, mPaint); mPaint.setColor(statusTrueColor); } break; } } public void setOnSwitchChangeListener(OnUISwitchChangeListener switchChangeListener) { this.switchChangeListener = switchChangeListener; } public void setType(int type) { this.type = type; } public int getStatusFalseColor() { return statusFalseColor; } public void setStatusFalseColor(int statusFalseColor) { this.statusFalseColor = statusFalseColor; } public int getStatusTrueColor() { return statusTrueColor; } public void setStatusTrueColor(int statusTrueColor) { this.statusTrueColor = statusTrueColor; } public interface OnUISwitchChangeListener{ public void onSwitchChanged(View view, boolean checked); } }