九宫格项目
功能介绍
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>
运行结果: