九宫格项目一

本文介绍了一款基于自定义View的九宫格密码锁项目的实现细节,包括如何通过滑动绘制连线、判断用户操作的有效性及密码的保存与验证等关键技术点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

九宫格项目

功能介绍

1.点击某圆圈后,在该圆圈的中心添加一个实行的小圆 
2.页面滑动出现一条跟随的线 
3.滑动到另一个圆圈时,产生一条连接的直线 
4.选择的圆圈点数大于等于4个后,手指抬起,就会保存密码。 

涉及到的知识点

· 本示例使用的是自定义的View来绘制九宫格,并保存图像

· 这里的九个点分别代表的是九个数值,获取到对应的数值证明绘制了那个点

· 程序中使用到的知识:

· 1、图像的描绘,圆和点的描绘,线的描绘

· 2、位置的判断,判断用户点的位置是否在某一个圆内

· 3、保存数据和相关判断是否保存密码。

主要源码:

package com.wgs.jiesuo;

 

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

 

import com.wgs.jiesuo.LockPatternView.Cell;

 

import android.content.Context;

import android.content.SharedPreferences;

import android.content.SharedPreferences.Editor;

import android.preference.PreferenceManager;

import android.util.Log;

 

public class LockPatternUtils {

//private static final String TAG = "LockPatternUtils";

private final static StringKEY_LOCK_PWD = "lock_pwd";

private static ContextmContext;

private static SharedPreferencespreference;

//private final ContentResolver mContentResolver;

 public LockPatternUtils(Context context) {

        mContext = context;

        preference = PreferenceManager.getDefaultSharedPreferences(mContext);

       // mContentResolver = context.getContentResolver();

 }

 /**

     * Deserialize a pattern.

     * @param string The pattern serialized with {@link #patternToString}

     * @return The pattern.

     */

    public static List<LockPatternView.Cell> stringToPattern(String string) {

        List<LockPatternView.Cell> result = new ArrayList<LockPatternView.Cell>();

 

        final byte[] bytes = string.getBytes();

        for (int i = 0; i < bytes.length; i++) {

            byte b = bytes[i];

            result.add(LockPatternView.Cell.of(b / 3, b % 3));

        }

        return result;

    }

 

    /**

     * Serialize a pattern.

     * @param pattern The pattern.

     * @return The pattern in string form.

     */

    public static String patternToString(List<LockPatternView.Cell> pattern) {

        if (pattern ==null) {

            return "";

        }

        final int patternSize = pattern.size();

 

        byte[] res =new byte[patternSize];

        for (int i = 0; i < patternSize; i++) {

            LockPatternView.Cell cell = pattern.get(i);

            res[i] = (byte) (cell.getRow() * 3 + cell.getColumn());

        }

        return Arrays.toString(res);

    }

    

    public void saveLockPattern(List<LockPatternView.Cell> pattern){

    Editor editor =preference.edit();

    editor.putString(KEY_LOCK_PWD,patternToString(pattern));

    editor.commit();

    }

    

    public String getLockPaternString(){

    return preference.getString(KEY_LOCK_PWD, "");

    }

    

    public int checkPattern(List<LockPatternView.Cell> pattern) {

    String stored = getLockPaternString();

    if(!stored.isEmpty()){

    return stored.equals(patternToString(pattern))?1:0;

    }

    return -1;

    }

    

 

    public void clearLock() {

    saveLockPattern(null);

    }

  

 

}

package com.wgs.jiesuo;

 

import java.util.List;

 

import android.R.integer;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.Toast;

 

import com.wgs.jiesuo.LockPatternView.Cell;

import com.wgs.jiesuo.LockPatternView.DisplayMode;

import com.wgs.jiesuo.LockPatternView.OnPatternListener;

 

public class MainActivityextends Activityimplements OnClickListener {

 

// private OnPatternListener onPatternListener;

 

private LockPatternView lockPatternView;

 

private LockPatternUtils lockPatternUtils;

 

private Button btn_set_pwd;

 

private Button btn_reset_pwd;

 

private Button btn_check_pwd;

private boolean opFLag =true;

 

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

lockPatternView = (LockPatternView) findViewById(R.id.lpv_lock);

btn_reset_pwd = (Button) findViewById(R.id.btn_reset_pwd);

btn_set_pwd = (Button) findViewById(R.id.btn_set_pwd);

btn_check_pwd = (Button) findViewById(R.id.btn_check_pwd);

btn_reset_pwd.setOnClickListener(this);

btn_set_pwd.setOnClickListener(this);

btn_check_pwd.setOnClickListener(this);

 

lockPatternUtils = new LockPatternUtils(this);

lockPatternView.setOnPatternListener(new OnPatternListener() {

 

public void onPatternStart() {

 

}

 

public void onPatternDetected(List<Cell> pattern) {

if(opFLag){

int result = lockPatternUtils.checkPattern(pattern);

if (result!= 1) {

if(result==0){

lockPatternView.setDisplayMode(DisplayMode.Wrong);

Toast.makeText(MainActivity.this, "密码错误", Toast.LENGTH_LONG)

.show();

}else{

lockPatternView.clearPattern();

Toast.makeText(MainActivity.this, "请设置密码", Toast.LENGTH_LONG)

.show();

}

else {

Toast.makeText(MainActivity.this, "密码正确", Toast.LENGTH_LONG)

.show();

}

}else{

lockPatternUtils.saveLockPattern(pattern);

Toast.makeText(MainActivity.this, "密码已经设置", Toast.LENGTH_LONG)

.show();

lockPatternView.clearPattern();

}

}

 

public void onPatternCleared() {

 

}

 

public void onPatternCellAdded(List<Cell> pattern) {

 

}

}

);

}

 

public void onClick(View v) {

if (v == btn_reset_pwd) {

lockPatternView.clearPattern();

lockPatternUtils.clearLock();

else if (v == btn_check_pwd) {

opFLag = true;

else {

opFLag = false;

}

}

 

}

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:gravity="center"

    android:orientation="vertical">

    

 

    <com.wgs.jiesuo.LockPatternView

         xmlns:app="http://schemas.android.com/apk/res/com.wgs.jiesuo"

         android:id="@+id/lpv_lock"

         android:background="#334455"

         android:layout_width="300dp"

         android:layout_height="300dp"

        />

    

    <Button

        android:id="@+id/btn_set_pwd"

        android:layout_width="300dp"

        android:layout_height="wrap_content"

        android:text="设置密码"

        />

    <Button

        android:id="@+id/btn_reset_pwd"

        android:layout_width="300dp"

        android:layout_height="wrap_content"

        android:text="重置密码"

        />

     <Button

        android:id="@+id/btn_check_pwd"

        android:layout_width="300dp"

        android:layout_height="wrap_content"

        android:text="校验密码"

        />

</LinearLayout>





运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值