`

九宫格手势密码案例

阅读更多

九宫格手势密码案例

 

九宫格手势密码使用自定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对话框。

 

 

Java开发必备小助手:Javadoc文档注释

 

2. 选中“Javadoc”,点击Next。

 

Java开发必备小助手:Javadoc文档注释

 



 


  3. Javadoc command输入框指定javadoc.exe所在路径。这里,Javadoc的对象既可以是整个工程,也可以是部分package或class。根据需要,选择适合的类型。Destination:这个路径是我们存放生成后的文档的路径。点击Finish。

 


具体实现请看附件......

注:附件中还有不同样式手势操作

 

  • 大小: 35.6 KB
  • 大小: 63.7 KB
分享到:
评论
2 楼 yue_670176656 2014-11-05  
[flash=200,200][/flash]
[img][url]
[b]fb[/b]
[/url][/img]
引用
[b][/b]
1 楼 wangbt 2013-12-11  
谢谢 正在找这方面资料

相关推荐

Global site tag (gtag.js) - Google Analytics