安卓图案密码实现,纯自制,9宫格,16宫格可自定义。

废话不多说,直接贴代码,自己写的,转载请注明出处,

/**开发者:易魏
 * Created by Administrator on 2018/2/27.
 */

public class UnLockView extends View {
    private static final String TAG = "UnLockView";
    private int Number = 4;
    private int tempX = 0;
    private int tempY = 0;
    private int minSize = 4;
    private int UnTouchColor = 0xffffffff;
    private int TouchColor = 0xffffffff;
    private int lineColor = 0xffffffff;
    private Paint unTouchPaint;
    private Paint touchPaint;
    private Paint linePaint;
    private int mR = 0;
    private int pointAchor;
    private ArrayList<String> checks = new ArrayList<>();
    private Point nowPoint = new Point();
    private boolean isAllowTouchAgain = false;
    private boolean BeforeTouch = false;
    private PasswordResult passwordResult = null;
    private ArrayList<Point> points = new ArrayList<>();
    private ArrayList<Point> isTouchPoints = new ArrayList<>();
    private HashMap<Integer, Point> touchMap = new HashMap<>();
    private HashMap<Integer, Point> pointMap = new HashMap<>();

    public UnLockView(Context context) {
        super(context);
    }

    public UnLockView(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.UnLockView);
        Number = typedArray.getColor(R.styleable.UnLockView_number, 0xffffffff);
        UnTouchColor = typedArray.getColor(R.styleable.UnLockView_unCheckColor, 0xffffffff);
        TouchColor = typedArray.getColor(R.styleable.UnLockView_checkColor, 0xffffffff);
        touchPaint = new Paint();
        unTouchPaint = new Paint();
        linePaint = new Paint();
        unTouchPaint.setAntiAlias(true);
        touchPaint.setAntiAlias(true);
        linePaint.setAntiAlias(true);
        touchPaint.setColor(TouchColor);
        unTouchPaint.setColor(UnTouchColor);
        linePaint.setColor(lineColor);
        touchPaint.setStyle(Paint.Style.FILL);
        unTouchPaint.setStyle(Paint.Style.STROKE);
        unTouchPaint.setStrokeWidth(10);
        linePaint.setStyle(Paint.Style.STROKE);
    }

    public UnLockView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //这里防止平板或者横竖屏
        if (canvas.getHeight() > canvas.getWidth()) {
            mR = canvas.getWidth() / ((Number + 1) * 3);
            pointAchor = canvas.getWidth() / (Number + 1);
        } else {
            mR = canvas.getHeight() / ((Number + 1) * 3);
            pointAchor = canvas.getHeight() / (Number + 1);
        }
        linePaint.setStrokeWidth(mR / 3);
        if (tempX != Number || tempY != Number) {
            for (int i = 0; i < Number; i++) {
                for (int j = 0; j < Number; j++) {
                    Point point = new Point();
                    point.setX(j);
                    point.setY(i);
                    point.setNumber(j + i * Number);
                    Log.i(TAG, "onDraw: 点" + (j + i * Number));
                    points.add(point);
                    pointMap.put(point.getNumber(), point);
                }
            }
            tempX = Number;
            tempY = Number;
        }
        for (int i = 0; i < points.size(); i++) {
            canvas.drawCircle(getPointX(points.get(i).getX()), getPointY(points.get(i).getY()), mR, unTouchPaint);
        }
        for (int i = 0; i < isTouchPoints.size(); i++) {
            canvas.drawCircle(getPointX(isTouchPoints.get(i).getX()), getPointY(isTouchPoints.get(i).getY()), mR, touchPaint);
        }
        for (int i = 0; i < isTouchPoints.size(); i++) {
            if (i == isTouchPoints.size() - 1) {
                canvas.drawLine(getPointX(isTouchPoints.get(i).getX()), getPointY(isTouchPoints.get(i).getY()), nowPoint.getX(), nowPoint.getY(), linePaint);
            } else {
                canvas.drawLine(getPointX(isTouchPoints.get(i).getX()), getPointY(isTouchPoints.get(i).getY()), getPointX(isTouchPoints.get(i + 1).getX()), getPointY(isTouchPoints.get(i + 1).getY()), linePaint);
            }
        }
        for (int i = 0; i < isTouchPoints.size(); i++) {
            touchMap.put(isTouchPoints.get(i).getNumber(), isTouchPoints.get(i));
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (!isAllowTouchAgain & BeforeTouch) {
            return true;
        }
        BeforeTouch = false;
        nowPoint.setX((int) event.getX());
        nowPoint.setY((int) event.getY());
        int now = pointContainNow(event.getX(), event.getY());
        if (now != -1) {
            if (!checks.contains(String.valueOf(now + 1))) {
                if (isTouchPoints.size() >= 1) {
                    setPointToPoint(isTouchPoints.get(isTouchPoints.size() - 1), points.get(now));
                }
                checks.add(String.valueOf(now + 1));
                isTouchPoints.add(points.get(now));
            }
        }
        switch (event.getAction()) {
            case MotionEvent.ACTION_UP:
                BeforeTouch = true;
                if (isTouchPoints.size() < minSize) {
                    reSet();
                    Toast.makeText(getContext(), "您的密码小于" + minSize + "个点,请重新设置。", Toast.LENGTH_SHORT).show();
                } else {
                    nowPoint.setX(getPointX(isTouchPoints.get(isTouchPoints.size() - 1).getX()));
                    nowPoint.setY(getPointY(isTouchPoints.get(isTouchPoints.size() - 1).getY()));
                }
                if (passwordResult != null) {
                    passwordResult.result(checks);
                }
                invalidate();
                break;
        }
        invalidate();
        return true;
    }

    /**
     * 判断当前触摸点是否在圆之内。
     *
     * @param x
     * @param y
     * @return
     */
    private int pointContainNow(float x, float y) {
        for (int i = 0; i < points.size(); i++) {
            if ((getPointX(points.get(i).getX()) + mR / 2) > x & (getPointX(points.get(i).getX()) - mR / 2) < x & (getPointY(points.get(i).getY()) + mR / 2) > y & (getPointY(points.get(i).getY()) - mR / 2) < y) {
                return i;
            }
        }
        return -1;
    }

    private Point getPoint(int number) {
        return pointMap.get(number);
    }

    private void setPointToPoint(Point from, Point to) {
        int lastPointNum = from.getNumber();
        int lastPointX = from.getX();
        int lastPointY = from.getY();
        int newPointX = to.getX();
        int newPointY = to.getY();
        int newPointNum = to.getNumber();
        if (lastPointNum != newPointNum) {
            if (lastPointX == newPointX) {
                int small = getSmall(lastPointNum, newPointNum);
                int chaju = Math.abs(lastPointY - newPointY);
                for (int i = 1; i < chaju; i++) {
                    if (touchMap.get(small + (Number * i)) == null) {
                        checks.add(String.valueOf(small + (Number * i) + 1));
                        isTouchPoints.add(pointMap.get(small + (Number * i)));
                    }
                }
            } else if (lastPointY == newPointY) {
                int small = getSmall(lastPointNum, newPointNum);
                int chaju = Math.abs(lastPointX - newPointX);
                for (int i = 1; i < chaju; i++) {
                    if (touchMap.get(small + i) == null) {
                        checks.add(String.valueOf(small + i + 1));
                        isTouchPoints.add(pointMap.get(small + i));
                    }
                }
            } else if (Math.abs((lastPointX - newPointX)) == Math.abs((lastPointY - newPointY))) {
                int small = getSmall(lastPointNum, newPointNum);
                int chajuY = Math.abs(lastPointY - newPointY);
                for (int j = 1; j < chajuY; j++) {
                    if ((newPointY > lastPointY & newPointX > lastPointX) || (newPointY < lastPointY & newPointX < lastPointX)) {
                        if (touchMap.get(j + small + (Number * j)) == null) {
                            checks.add(String.valueOf(j + small + (Number * j) + 1));
                            isTouchPoints.add(pointMap.get(j + small + (Number * j)));
                        }
                    } else if ((newPointY > lastPointY & newPointX < lastPointX) || (newPointY < lastPointY & newPointX > lastPointX)) {
                        if (touchMap.get(small + (Number * j) - j) == null) {
                            checks.add(String.valueOf(small + (Number * j) - j + 1));
                            isTouchPoints.add(pointMap.get(small + (Number * j) - j));
                        }
                    }
                }
                if (lastPointNum > newPointNum) {

                }
            }
        }
    }

    private int getSmall(int arg1, int arg2) {
        if (arg1 > arg2) {
            return arg2;
        } else {
            return arg1;
        }
    }

    private int getPointX(int Xnumber) {
        return pointAchor * (Xnumber + 1);
    }

    private int getPointY(int Ynumber) {
        return pointAchor * (Ynumber + 1);
    }

    public void reSet() {
        isTouchPoints.clear();
        checks.clear();
        BeforeTouch = false;
        touchMap.clear();
        invalidate();
    }

    public int getTouchColor() {
        return TouchColor;
    }

    public void setTouchColor(int touchColor) {
        TouchColor = touchColor;
        invalidate();
    }

    public Paint getTouchPaint() {
        return touchPaint;
    }

    public void setTouchPaint(Paint touchPaint) {
        this.touchPaint = touchPaint;
        invalidate();
    }

    public int getUnTouchColor() {
        return UnTouchColor;
    }

    public void setUnTouchColor(int unTouchColor) {
        UnTouchColor = unTouchColor;
        invalidate();
    }

    public Paint getUnTouchPaint() {
        return unTouchPaint;
    }

    public void setUnTouchPaint(Paint unTouchPaint) {
        this.unTouchPaint = unTouchPaint;
        invalidate();
    }

    public int getLineColor() {
        return lineColor;
    }

    public void setLineColor(int lineColor) {
        this.lineColor = lineColor;
        invalidate();
    }

    public int getNumber() {
        return Number;
    }

    public void setNumber(int number) {
        Number = Number;
        Number = Number;
        Number = number;
    }

    public boolean isAllowTouchAgain() {
        return isAllowTouchAgain;
    }

    public void setAllowTouchAgain(boolean allowTouchAgain) {
        isAllowTouchAgain = allowTouchAgain;
    }

    public PasswordResult getPasswordResult() {
        return passwordResult;
    }

    public void setPasswordResult(PasswordResult passwordResult) {
        this.passwordResult = passwordResult;
    }

    class Point {
        private int X;
        private int Y;
        private int number;

        public int getX() {
            return X;
        }

        public void setX(int x) {
            X = x;
        }

        public int getY() {
            return Y;
        }

        public void setY(int y) {
            Y = y;
        }

        public int getNumber() {
            return number;
        }

        public void setNumber(int number) {
            this.number = number;
        }
    }

    interface PasswordResult {
        void result(ArrayList<String> result);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值