码迷,mamicode.com
首页 > 其他好文 > 详细

九宫格手势密码

时间:2015-05-07 16:48:33      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:

公司项目中需要做一个手势密码,效果如图:

技术分享

上面小的手势图与下面大的联动,效果:


技术分享

由于没有合用的第三方,就只好自己写了一个,根据需求,下面的每连上一个点就需要通知上方小密码盘,做相应改变,并且绘制完成后,需要获取手势密码的内容,所以设计了如下接口:

public interface GesturesPasswordListener {
	/**
	 * 
	 * @param list 绘制完成的密码
	 */
	void getGesturesPassword(List<Integer> list);
	/**
	 * 
	 * @param list 每绘制完成一个密码点,返回当前绘制密码
	 */
	void changeGesturesPassword(List<Integer> list);
}

直接重写View

public class GesturesPasswordView extends View

为View绑定监听

public void setListener(GesturesPasswordListener listener) {
		this.listener = listener;
	}

在Activity中实现接口:

private GesturesPasswordListener listener = new GesturesPasswordListener() {

		@Override
		public void getGesturesPassword(List<Integer> list) {
			if (resoure == 0) {
				if (cur == 0) {
					if(list.size()<4){
						initList = new ArrayList<Integer>();
						small_gesture.setList(initList);
						sjh.setTextColor(Color.RED);
						sjh.setText("至少绘制四个点");
					}else{
						sjh.setTextColor(Color.parseColor("#d6d6d6"));
						sjh.setText("再次绘制解锁图案");
						initList = new ArrayList<Integer>();
						initList = list;
						jump.setVisibility(View.VISIBLE);
						jump.setText("重新输入");
						cur = 1;
					}
				} else {
					if (initList.equals(list)) {
						SharePrefUtil.saveBoolean(SetGestureActivity.this,
								SharePrefUtil.GEST_SP_NAME,
								SharePrefUtil.IS_SAVEGESTURE, true);
						SharePrefUtil.saveObj(SetGestureActivity.this,
								SharePrefUtil.GEST_SP_NAME,
								SharePrefUtil.GESTURE, initList);
						SharePrefUtil.saveBoolean(SetGestureActivity.this,
								SharePrefUtil.GEST_SP_NAME,
								SharePrefUtil.EVER_LOGIN, true);
						Intent intent = new Intent();
						intent.setClass(SetGestureActivity.this,
								HomeActivity.class);
						startActivity(intent);
					} else {
						sjh.setTextColor(Color.RED);
						sjh.setText("与上次输入不一致,请重新输入");
					}
				}
			}
		}

		@Override
		public void changeGesturesPassword(List<Integer> list) {
			if (cur == 0) {
				small_gesture.setList(list);
			}
		}
	};

为下面大的绑定接口:

large_gesture.setListener(listener);

需要注意的是对View的滑动事件的处理,在手势密码中重写事件处理:

@Override
	public boolean onTouchEvent(MotionEvent event) {
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:

			float dx = event.getX();
			float dy = event.getY();
			int dlocation = getLocation(dx, dy);
			if (dlocation != 0) {
				list.add(dlocation);
				if(listener != null)
					listener.changeGesturesPassword(list);
				postInvalidate();
			}
			break;
		case MotionEvent.ACTION_MOVE:
			float mx = event.getX();
			float my = event.getY();
			int mlocation = getLocation(mx, my);
			if (mlocation != 0) {
				if (list.size() > 0) {
					if (mlocation != list.get(list.size() - 1)) {
						list.add(mlocation);
						if(listener != null)
							listener.changeGesturesPassword(list);
					}
				} else {
					list.add(mlocation);
					if(listener != null)
						listener.changeGesturesPassword(list);
				}
			}
			postInvalidate();
			break;
		case MotionEvent.ACTION_UP:
			if(list.size() > 0){
				if(listener != null)
				listener.getGesturesPassword(list);
			}
			list = new ArrayList<Integer>();
			postInvalidate();
			break;
		default:
			break;
		}
		return true;
	}

源码下载链接:http://download.csdn.net/detail/qq_18833399/8672395

九宫格手势密码

标签:

原文地址:http://blog.csdn.net/qq_18833399/article/details/45561239

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!