标签:
公司项目中需要做一个手势密码,效果如图:
上面小的手势图与下面大的联动,效果:
由于没有合用的第三方,就只好自己写了一个,根据需求,下面的每连上一个点就需要通知上方小密码盘,做相应改变,并且绘制完成后,需要获取手势密码的内容,所以设计了如下接口:
public interface GesturesPasswordListener {
	/**
	 * 
	 * @param list 绘制完成的密码
	 */
	void getGesturesPassword(List<Integer> list);
	/**
	 * 
	 * @param list 每绘制完成一个密码点,返回当前绘制密码
	 */
	void changeGesturesPassword(List<Integer> list);
}public class GesturesPasswordView extends View
public void setListener(GesturesPasswordListener listener) {
		this.listener = listener;
	}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);
@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://blog.csdn.net/qq_18833399/article/details/45561239