package com.hdl.widget.gesturelock; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.view.View; import com.hdl.widget.HDLUtlisXM; /** * Created by JLChen on 2019/10/30 * QQ手势解锁样式 */ public class QQLockView extends View implements ILockView { private static int DEFAULT_BACK_COLOR = 0x00000000; private Paint mPaint; private int mCurrentState = NO_FINGER; private float mOuterRadius; private float mInnerRadius; public QQLockView(Context context) { this(context, null); } public QQLockView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(context); } private void init(Context context) { mPaint = new Paint(); mPaint.setAntiAlias(true); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); width = width > height ? height : width; setMeasuredDimension(width, width); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); float space = 10; float x = getWidth() / 2; float y = getHeight() / 2; canvas.translate(x, y); mOuterRadius = x - space; mInnerRadius = (x - space) / 3; switch (mCurrentState) { case NO_FINGER: drawNoFinger(canvas); break; case FINGER_TOUCH: drawFingerTouch(canvas); break; case FINGER_UP_MATCHED: drawFingerUpMatched(canvas); break; case FINGER_UP_UN_MATCHED: drawFingerUpUnmatched(canvas); break; } } /** * 画无手指触摸状态 * * @param canvas */ private void drawNoFinger(Canvas canvas) { mPaint.setStyle(Paint.Style.STROKE); mPaint.setColor(GestureLockView.DEFAULT_BORDER_COLOR); mPaint.setStrokeWidth(HDLUtlisXM.dp2px(getContext(),1)); canvas.drawCircle(0, 0, mOuterRadius, mPaint); } /** * 画手指触摸状态 * * @param canvas */ private void drawFingerTouch(Canvas canvas) { mPaint.setStyle(Paint.Style.FILL); mPaint.setColor(DEFAULT_BACK_COLOR); canvas.drawCircle(0, 0, mOuterRadius, mPaint); mPaint.setColor(GestureLockView.DEFAULT_SELECT_COLOR); canvas.drawCircle(0, 0, mInnerRadius, mPaint); mPaint.setStyle(Paint.Style.STROKE); mPaint.setColor(GestureLockView.DEFAULT_SELECT_COLOR); mPaint.setStrokeWidth(HDLUtlisXM.dp2px(getContext(),1)); canvas.drawCircle(0, 0, mOuterRadius, mPaint); } /** * 画手指抬起,匹配状态 * * @param canvas */ private void drawFingerUpMatched(Canvas canvas) { mPaint.setStyle(Paint.Style.FILL); mPaint.setColor(DEFAULT_BACK_COLOR); canvas.drawCircle(0, 0, mOuterRadius, mPaint); mPaint.setColor(GestureLockView.DEFAULT_SELECT_COLOR); canvas.drawCircle(0, 0, mInnerRadius, mPaint); mPaint.setStyle(Paint.Style.STROKE); mPaint.setColor(GestureLockView.DEFAULT_SELECT_COLOR); mPaint.setStrokeWidth(HDLUtlisXM.dp2px(getContext(),2)); canvas.drawCircle(0, 0, mOuterRadius, mPaint); } /** * 画手指抬起,不匹配状态 * * @param canvas */ private void drawFingerUpUnmatched(Canvas canvas) { mPaint.setStyle(Paint.Style.FILL); mPaint.setColor(DEFAULT_BACK_COLOR); canvas.drawCircle(0, 0, mOuterRadius, mPaint); mPaint.setColor(GestureLockView.DEFAULT_SELECT_FALSE_COLOR); canvas.drawCircle(0, 0, mInnerRadius, mPaint); mPaint.setStyle(Paint.Style.STROKE); mPaint.setColor(GestureLockView.DEFAULT_SELECT_FALSE_COLOR); mPaint.setStrokeWidth(HDLUtlisXM.dp2px(getContext(),1)); canvas.drawCircle(0, 0, mOuterRadius, mPaint); } @Override public View getView() { return this; } @Override public void onNoFinger() { mCurrentState = NO_FINGER; postInvalidate(); } @Override public void onFingerTouch() { mCurrentState = FINGER_TOUCH; postInvalidate(); } @Override public void onFingerUpMatched() { mCurrentState = FINGER_UP_MATCHED; postInvalidate(); } @Override public void onFingerUpUnmatched() { mCurrentState = FINGER_UP_UN_MATCHED; postInvalidate(); } public void setCurrentState(int state) { this.mCurrentState = state; postInvalidate(); } }