九宫格手势密码案例
九宫格手势密码使用自定View实现,例:
package com.example.getturepwdline;
import com.example.util.CommonUtil;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Cap;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
/**
* 自定义控件实现手势密码的九宫格
* @author zhouchaoxin
*
*/
public class PointNineView extends View{
/**
* 线画笔
*/
Paint linePaint = new Paint();
/**
* 白色线画笔
*/
Paint whiteLinePaint = new Paint();
/**
* 文字画笔
*/
Paint textPaint = new Paint();
Bitmap defaultBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.lock);
int defaultBitmapRadius = defaultBitmap.getWidth() / 2;
Bitmap selectedBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.indicator_lock_area);
/**
* 选择位图直径
*/
int selectedBitmapDiameter = selectedBitmap.getWidth();
/**
* 选择位图半径
*/
int selectedBitmapRadius = selectedBitmapDiameter / 2;
/**
* 自定义9个点
*/
PointInfo[] points = new PointInfo[9];
/**
* 开始点
*/
PointInfo startPoint = null;
/**
* 宽,高
*/
int width,height;
/**
* 移动的X,Y位置
*/
int moveX,moveY;
/**
* 开始X,Y的位置
*/
private int startX = 0,startY = 0;
/**
*
* 是否抬起
*
*/
boolean isUP = false;
Context cxt;
StringBuffer lockString = new StringBuffer();
/**
* 构造函数
* @param context
*/
public PointNineView(Context context) {
super(context);
cxt = context;
initPaint();
}
/**
* 构造函数
* @param context
*/
public PointNineView(Context context,AttributeSet attrs) {
super(context, attrs);
initPaint();
}
/**
* 构造函数
* @param context
*/
public PointNineView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initPaint();
}
/**
* 来确定子view的大小尺寸
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
width = getWidth();
height = getHeight();
if (width !=0 && height != 0) {
//初始化一个九宫格
initPoints(points);
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
/**
* 来确定子view的位置
*/
@Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
super.onLayout(changed, left, top, right, bottom);
}
/**
* 重写onDraw
*/
@Override
protected void onDraw(Canvas canvas) {
if (moveX != 0 && moveY != 0 && startX != 0 && startY != 0) {
}
drawNinePoint(canvas);
super.onDraw(canvas);
}
/**
* 屏幕触摸事件
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean flag = true;
if (isUP) {
finishDraw();
flag= false;
}
else{
handlingEvent(event);
flag = true;
}
return flag;
}
/**
* 事件处理
* @param event 事件类型
*/
private void handlingEvent(MotionEvent event){
//MotionEven手势事件
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE: //移动事件
moveX = (int)event.getX();
moveY = (int)event.getY();
for (PointInfo temp: points) {
if (temp.isInMyPlace(moveX, moveY) && temp.isSelected() == false) {
temp.setSelected(true);
startX = temp.getCenterX();
startY = temp.getCenterY();
int len = lockString.length();
if (len != 0) {
char charTemp = lockString.charAt(len - 1);
int preId = charTemp - 48;
points[preId].setNextId(temp.getId());
}
lockString.append(temp.getId());
break;
}
}
//刷新View ,左、上、右、下
invalidate(0,height - width,width,height);
break;
//按下事件
case MotionEvent.ACTION_DOWN:
int downX = (int) event.getX();
int downY = (int) event.getY();
for (PointInfo temp : points) {
if (temp.isInMyPlace(downX, downY)) {
temp.setSelected(true);
startPoint = temp;
startX = temp.getCenterX();
startY = temp.getCenterY();
lockString.append(temp.getId());
break;
}
}
invalidate(0, height - width, width, height);
break;
//抬起事件
case MotionEvent.ACTION_UP:
startX = startY = moveX = moveY = 0;
isUP = true;
invalidate();
savePwd();
break;
default:
break;
}
}
/**
* 结束在view上的画画操作
*/
private void finishDraw(){
for (PointInfo temp : points) {
temp.setSelected(false);
temp.setNextId(temp.getId());
}
lockString.delete(0, lockString.length());
isUP = false;
invalidate();
}
/**
* 初始化点
* @param points
*/
private void initPoints(PointInfo[] points){
int len = points.length;
int seletedSpacing = (width - selectedBitmapDiameter * 3) / 4;
int seletedX = seletedSpacing;
int seletedY = height - width + seletedSpacing;
int defaultX = seletedX + selectedBitmapRadius - defaultBitmapRadius;
int defaultY = seletedY + selectedBitmapRadius - defaultBitmapRadius;
for (int i = 0; i < len; i++) {
if (i == 3 || i == 6) {
seletedX = seletedSpacing;
seletedY += selectedBitmapDiameter + seletedSpacing;
defaultX = seletedX + selectedBitmapRadius
- defaultBitmapRadius;
defaultY += selectedBitmapDiameter + seletedSpacing;
}
points[i] = new PointInfo(i, defaultX, defaultY, seletedX, seletedY);
seletedX += selectedBitmapDiameter + seletedSpacing;
defaultX += selectedBitmapDiameter + seletedSpacing;
}
}
/**
* 初始化画笔
*/
private void initPaint(){
initLinePaint(linePaint);
initTextPaint(textPaint);
initWhiteLinePaint(whiteLinePaint);
}
/**
*
* @param paint
*/
private void initLinePaint(Paint paint){
paint.setColor(Color.GRAY);
//设置两个点之间的线的背景的宽度
paint.setStrokeWidth(30);
paint.setAntiAlias(true);
//画笔笔刷类型
paint.setStrokeCap(Cap.ROUND);
//防拌动
//paint.setDither(true);
}
/**
*
* @param paint
*/
private void initTextPaint(Paint paint){
paint.setTextSize(30);;
paint.setAntiAlias(true);
/**
* Typeface.DEFAULT:默认字体。
Typeface.DEFAULT_BOLD:加粗字体。
Typeface.MONOSPACE:monospace字体。
Typeface.SANS_SERIF:sans字体。
Typeface.SERIF:serif字体
*/
//设置字体样式,monospace字体
paint.setTypeface(Typeface.MONOSPACE);
}
/**
*
* @param paint
*/
private void initWhiteLinePaint(Paint paint){
paint.setColor(Color.WHITE);
paint.setStrokeWidth(20);//设置两个点之间的线的宽度
paint.setAntiAlias(true);
paint.setStrokeCap(Cap.ROUND);
}
/**
* 画9个点
* @param canvas
*/
private void drawNinePoint(Canvas canvas){
if (startPoint != null) {
drawEachLine(canvas, startPoint);
}
for (PointInfo pointInfo : points) {
if (pointInfo != null) {
if (pointInfo.isSelected()) {
canvas.drawBitmap(selectedBitmap, pointInfo.getSeletedX(),pointInfo.getSeletedY(), null);
}
canvas.drawBitmap(defaultBitmap, pointInfo.getDefaultX(), pointInfo.getDefaultY(),null);
}
}
}
/**
* 递归 画出每个点
* @param canvas
* @param point
*/
private void drawEachLine(Canvas canvas, PointInfo point) {
if (point.hasNextId()) {
int n = point.getNextId();
drawLine(canvas,point.getCenterX(),point.getCenterY(),points[n].getCenterX(),points[n].getCenterY());
drawEachLine(canvas, points[n]);
}
}
/**
* 开始画线
* @param canvas 画布
* @param startX 开始X位置
* @param startY 开支Y位置
* @param stopX 停止X位置
* @param stopY 停止Y位置
*/
private void drawLine(Canvas canvas,float startX,float startY,float stopX,float stopY){
canvas.drawLine(startX, startY, stopX, stopY, linePaint);
canvas.drawLine(startX, startY, stopX, stopY, whiteLinePaint);
}
/**
* 内部类,点
* @author zhouchaoxin
*
*/
private class PointInfo{
/**
* 序号
*/
private int id;
/**
* 下一个ID序号
*/
private int nextId;
/**
* 是否选中
*/
private boolean selected;
/**
* 默认X位置
*/
private int defaultX;
/**
* 默认Y位置
*/
private int defaultY;
/**
* 选择时的X位置
*/
private int seletedX;
/**
* 选择时的Y位置
*/
private int seletedY;
public PointInfo(int id, int defaultX,int defaultY, int seletedX, int seletedY) {
this.id = id;
this.nextId = id;
this.defaultX = defaultX;
this.defaultY = defaultY;
this.seletedX = seletedX;
this.seletedY = seletedY;
}
public boolean isSelected() {
return selected;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
public int getId() {
return id;
}
public int getDefaultX() {
return defaultX;
}
public int getDefaultY() {
return defaultY;
}
public int getSeletedX() {
return seletedX;
}
public int getSeletedY() {
return seletedY;
}
public int getCenterX() {
return seletedX + selectedBitmapRadius;
}
public int getCenterY() {
return seletedY + selectedBitmapRadius;
}
public boolean hasNextId() {
return nextId != id;
}
public int getNextId() {
return nextId;
}
public void setNextId(int nextId) {
this.nextId = nextId;
}
/**
* 是否移动到点的位置上
* @param x 方向
* @param y 方向
*/
public boolean isInMyPlace(int x, int y) {
boolean inX = x > seletedX && x < (seletedX + selectedBitmapDiameter);
boolean inY = y > seletedY && y < (seletedY + selectedBitmapDiameter);
return (inX && inY);
}
}
/**
* 获取本次的密码
* @return
*/
public String getPwd(){
return lockString.toString();
}
/**
* 保存密码并且判断界面的跳转
*/
public void savePwd(){
Intent intent = new Intent();
//SharedPreferences shareDate = cxt.getSharedPreferences("GUE_PWD", Activity.MODE_PRIVATE);
//是否第一次设置密码
//boolean isSetFirst = shareDate.getBoolean("IS_SET_FIRST", false);
boolean isSetFirst = CommonUtil.getIsSetFirst(cxt);
//如果第一次已经设置密码,验证第二次和第一次是否一致
if (isSetFirst) {
String pwd = this.getPwd();
//得到第一次设置的密码
//String first_pwd = shareDate.getString("FIRST_PWD", "NO HAVE PWD");
String first_pwd = CommonUtil.getFirstPwd(cxt);
//第二次密码和第一次密码一样 设置成功
if (pwd.equals(first_pwd)) {
//shareDate.edit().clear().commit();
//shareDate.edit().putBoolean("IS_SET", true).commit();
//shareDate.edit().putString("GUE_PWD", pwd).commit();
//CommonUtil.clearData(cxt);
CommonUtil.saveIsSetFirst(cxt, true);
CommonUtil.saveFistPwd(cxt, pwd);
intent.setClass(cxt,SetPwdActivity.class);
}
//第二次输入的密码和第一次输入的密码不一致
else{
//shareDate.edit().putBoolean("SECOND_ERROR", true).commit();
CommonUtil.saveSecondError(cxt, true);
intent.setClass(cxt, MainActivity.class);
}
}//第一次设置手势密码
else{
//shareDate.edit().clear().commit();
//shareDate.edit().putString("FIRST_PWD", this.getPwd()).commit();
//shareDate.edit().putBoolean("IS_SET_FIRST", true).commit();
//-------------
//CommonUtil.clearData(cxt);
CommonUtil.saveFistPwd(cxt, this.getPwd());
CommonUtil.saveIsSetFirst(cxt, true);
intent.setClass(cxt, MainActivity.class);
}
cxt.startActivity(intent);
((Activity)cxt).finish();
}
}
Javadoc文档注释
如何使用Eclipse生成Javadoc
1. 首先,选中Java目标工程,点击下拉菜单File,选中Export,会弹出Export对话框。
|
|
3. Javadoc command输入框指定javadoc.exe所在路径。这里,Javadoc的对象既可以是整个工程,也可以是部分package或class。根据需要,选择适合的类型。Destination:这个路径是我们存放生成后的文档的路径。点击Finish。
具体实现请看附件......
注:附件中还有不同样式手势操作
相关推荐
【安卓九宫格手势锁demo】是一个专门为Android平台设计的自定义View组件,它实现了一个简单易用的手势密码锁定功能。在移动应用开发中,手势锁作为一种安全验证方式,常用于保护用户的隐私数据或者敏感操作,比如...
九宫格锁屏的关键在于手势识别。用户在九个方格上按顺序点击形成特定的路径,系统需要记录并比较这个路径。这可以通过在`onTouchEvent(MotionEvent event)`方法中处理触摸事件,跟踪手指的移动路径来实现。 4. **...
在Android开发中,"九宫格 加锁 解锁"通常是指一种常见的用户界面设计,用于密码解锁或设置快捷方式。这种设计模式广泛应用于各种设备,尤其是智能手机和平板电脑的锁屏界面。九宫格通常由9个小方块组成,用户通过...
九宫格锁屏是一种常见的移动设备安全保护机制,它源于早期的数字密码锁,但提供了更个性化的解锁方式。在支付宝等应用中,九宫格锁屏被用来增强用户账户的安全性,防止未经授权的访问。这种锁屏模式通过用户自定义的...
九宫格手势密码的界面由9个点组成一个3x3的矩阵,用户通过连续连接任意数量的点(通常至少4个)形成一条路径,这条路径就是手势密码。系统会记录每个点的坐标以及点之间的连接顺序,以此作为验证密码的标准。 2. *...
在这个“微信小程序开发-手势解锁密码案例源码.zip”压缩包中,包含了一个具体的手势解锁密码的实现代码,这对于学习微信小程序开发以及移动应用安全性的开发者来说,是一个非常实用的学习资源。 手势解锁密码,也...
它通过用户在预设的九宫格图形上绘制特定的路径来解锁设备或应用,提供了直观且个性化的安全保护。本篇文章将深入探讨如何在Android平台上利用自定义View和ViewGroup实现滑动手势密码锁。 首先,我们要理解Android...
手势密码通常由用户在九宫格图案上绘制一条连续的路径来设定,这条路径连接了至少四个点,每个点代表一个数字。系统会记录这个路径的顺序和位置,用于后续的解锁验证。 **二、GestureLockView实现** 1. **自定义...
作者vicool,源码Glock,仿支付宝手势密码,我们大家都比较熟悉的一直解锁案例。
本项目涉及的是使用jQuery实现一个手势图案密码设置的功能,类似于许多智能手机中的九宫格解锁方式。这样的功能可以应用于网页登录、安全验证等多个场景,提供一种直观且用户友好的验证手段。 首先,我们需要理解...
1. 用户创建:用户首次设置手势密码时,会在预设的九宫格上选择并连接若干个点,这个路径被记录下来。 2. 数据存储:系统将用户的绘制路径转换为一种可存储的形式,如坐标序列或二进制数据,并安全地保存在设备上。 ...
手势解锁功能是移动设备中常见的安全机制,用户通过在预设的九宫格上滑动手指绘制特定的图案来解锁应用或设备。在微信小程序中实现这一功能,通常会涉及到以下几个技术点: 1. **Canvas组件**:手势解锁的核心部分...
在这个应用中,我们看到的是一个简单的九宫格布局,用户可以在这些格子间滑动手指,形成一条连续的线,这条线就构成了手势密码。 1. **自定义控件**: 在Android中,为了实现这种独特的锁屏界面,开发者通常会创建...
手势密码的基本原理是用户通过在预设的九宫格上绘制特定的连续线段来创建一个自定义的图案,这个图案代表了用户的密码。系统会记录这个图案的起始点、经过的点以及顺序,以便在后续验证时与用户输入的图案进行匹配。...