简单的手势密码

package com.heaven.smartapplock.tools;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

import com.heaven.smartapplock.OnCircleCompleteListener;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;



public class CircleView extends View {
    private OnCircleCompleteListener listener;


    private List<Point> circlePoints; // 圆圈的中心点坐标
    private List<Point> linePoints; // 线条的起始点和终止点坐标
    private Paint circlePaint; // 圆圈的画笔
    private Paint linePaint; // 线条的画笔
    private String a="0";

    public CircleView(Context context) {
        super(context);
        init();
    }

    public CircleView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CircleView(Context context, AttributeSet attrs, int defStyleAttr,OnCircleCompleteListener listener) {
        super(context, attrs, defStyleAttr);
        this.listener = listener;
        init();
    }

    private void init() {
        circlePoints = new ArrayList<>();
        linePoints = new ArrayList<>();

        // 初始化圆圈的画笔
        circlePaint = new Paint();
        circlePaint.setColor(Color.GRAY);
        circlePaint.setStyle(Paint.Style.FILL);

        // 初始化线条的画笔
        linePaint = new Paint();
        linePaint.setColor(Color.BLUE);
        linePaint.setStyle(Paint.Style.STROKE);
        linePaint.setStrokeWidth(10);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

        // 计算九个圆圈的中心点坐标
        int radius = Math.min(w, h) / 9;
        int spacing = (int) (radius * 1.5); // 圆圈之间的间隔大小

        int startX = (w - spacing * 2 * 3) / 2;
        int startY = (h - spacing * 2 * 3) / 2;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                int centerX = startX + spacing + j * spacing * 2;
                int centerY = startY + spacing + i * spacing * 2;
                circlePoints.add(new Point(centerX, centerY));
            }
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 绘制圆圈
        for (int i = 0; i < circlePoints.size(); i++) {
            Point point = circlePoints.get(i);
            if (a.contains(String.valueOf(i + 1))) {
                circlePaint.setColor(Color.BLUE);  // 如果a包含当前圆圈的编号,则设置为绿色
            } else {
                circlePaint.setColor(Color.GRAY);  // 否则设置为红色
            }
            canvas.drawCircle(point.x, point.y, 50, circlePaint);
        }
        // 绘制线条
        Path path = new Path();
        for (int i = 0; i < linePoints.size(); i += 2) {
            Point startPoint = linePoints.get(i);
            Point endPoint = linePoints.get(i + 1);
            path.moveTo(startPoint.x, startPoint.y);
            path.lineTo(endPoint.x, endPoint.y);
        }
        canvas.drawPath(path, linePaint);
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // 清空线条的起始点和终止点坐标
                linePoints.clear();
                break;
            case MotionEvent.ACTION_MOVE:
                // 获取当前手指的坐标
                int x = (int) event.getX();
                int y = (int) event.getY();

                // 判断手指是否在圆圈内
                for (Point point : circlePoints) {
                    if (Math.pow(x - point.x, 2) + Math.pow(y - point.y, 2) <= Math.pow(50, 2)) {
                        // 添加线条的起始点和终止点坐标
                        linePoints.add(new Point(point.x, point.y));
                        linePoints.add(new Point(x, y));
                        break;
                    }
                }
                break;
            case MotionEvent.ACTION_UP:
                // 输出经过了哪些圆圈
                StringBuilder result = new StringBuilder();
                for (Point point : linePoints) {
                    for (int i = 0; i < circlePoints.size(); i++) {
                        Point circlePoint = circlePoints.get(i);
                        if (point.x == circlePoint.x && point.y == circlePoint.y) {
                            result.append(i + 1).append(" ");
                            break;
                        }
                    }
                }


                String resultString = result.toString();
                Set<Character> charSet = new HashSet<>();
                // 将字符串中的每个字符添加到Set集合中
                for (int i = 0; i < resultString.length(); i++) {
                    charSet.add(resultString.charAt(i));
                }
                // 将Set集合转换回字符串
                StringBuilder sb = new StringBuilder();
                for (Character c : charSet) {
                    sb.append(c);
                }
                a = sb.toString();
                System.out.println("经过了圆圈:" + a);

                // 通过接口返回结果
                if (listener != null) {
                    listener.onCircleComplete(a);
                }
                break;
        }

        // 重绘View
        invalidate();
        return true;
    }
    public void setOnCircleCompleteListener(OnCircleCompleteListener listener) {
        this.listener = listener;
    }

}
package com.heaven.smartapplock;

public interface OnCircleCompleteListener {
    void onCircleComplete(String result);
}

接口的返回值为String型的一串数字代表以此经过了多少个圆圈(共九个)

package com.heaven.smartapplock.activity;

import androidx.fragment.app.FragmentActivity;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.heaven.smartapplock.OnCircleCompleteListener;
import com.heaven.smartapplock.R;
import com.heaven.smartapplock.tools.CircleView;

public class SetActivity extends FragmentActivity {

    private CircleView circleView;
    private SharedPreferences sharedPreferences;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_set);


        initView();

        sharedPreferences = getSharedPreferences("key", MODE_PRIVATE);

        circleView.setOnCircleCompleteListener(new OnCircleCompleteListener() {
            @Override
            public void onCircleComplete(String result) {
                // 在这里处理返回值a

                String trimmedResult = result.trim();
                int intValue = 0;
                if (!trimmedResult.isEmpty()) {
                    try {
                        intValue = Integer.parseInt(trimmedResult);
                    } catch (NumberFormatException e) {
                        Log.e("NumberFormatException", e.getMessage());
                    }
                    }else {
                    Toast.makeText(SetActivity.this, "empty", Toast.LENGTH_SHORT).show();

                }
                // 判断位数大于等于4并且不为空
                if (trimmedResult.length() >= 4 && !trimmedResult.isEmpty()) {
                    Log.d("result", String.valueOf(intValue));
                    SharedPreferences.Editor editor = sharedPreferences.edit();
                    editor.putInt("result", intValue);
                    editor.apply();
                    startActivity(new Intent(SetActivity.this, SetAgainActivity.class));
                    finish();
                }else {
                    Toast.makeText(SetActivity.this, "must >= 4 numbers", Toast.LENGTH_SHORT).show();
                }


            }
        });

    }

    private void initView() {
        circleView = (CircleView) findViewById(R.id.pattern_lock_view);
    }
}

利用简单的缓存存储手势密码,保存为Int型方便后续的判断

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值