修改com.android.internal.widget.LockPatternView,去掉不需要的内容;
登录界面,监听PatternView的手势事件,处理手势结果。
Handler的用法,防止potential memory leak.
下面贴出LoginActivity的示例代码:
public class LoginActivity extends Activity {
private static final int WrongPattern = 1;
private LoginHandler handler;
private LockPatternView patternView;
public LockPatternView getPatternView() {
return patternView;
}
public void setPatternView(LockPatternView patternView) {
this.patternView = patternView;
}
static class LoginHandler extends Handler {
private WeakReference<LoginActivity> outer;
public LoginHandler(LoginActivity activity) {
outer = new WeakReference<LoginActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
LoginActivity activity = this.outer.get();
if (activity != null) {
LockPatternView patternView = activity.getPatternView();
switch (msg.what) {
case WrongPattern: {
patternView.clearPattern();
break;
}
default:
break;
}
}
}
}
@Override
protected void onStart() {
super.onStart();
handler = new LoginHandler(this);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
patternView = (LockPatternView) findViewById(R.id.lockPattern);
//图案手势监听
patternView.setOnPatternListener(new OnPatternListener() {
@Override
public void onPatternStart() {
// do nothing
}
@Override
public void onPatternCleared() {
// do nothing
}
@Override
public void onPatternCellAdded(List<Cell> pattern) {
// do nothing
}
@Override
public void onPatternDetected(List<Cell> pattern) {
// TODO Auto-generated method stub
for (Cell cell : pattern) {
// System.out.println("[" + cell.getRow() + ","
// + cell.getColumn() + "]");
System.out.println(cell.toString());
// 手势图案,序列化,加密存储当成密码
}
if (pattern.size() == 3) {//测试错误图案效果
patternView.setDisplayMode(DisplayMode.Wrong);
Toast.makeText(LoginActivity.this, "3个点,图案密码错误!",
Toast.LENGTH_SHORT).show();
handler.sendEmptyMessageDelayed(WrongPattern, 1 * 2000);
} else if (pattern.size() == 4) {//测试错误图案效果
patternView.setDisplayMode(DisplayMode.Wrong);
Toast.makeText(LoginActivity.this, "4个点,图案密码错误!",
Toast.LENGTH_SHORT).show();
handler.postDelayed(new Runnable() {
@Override
public void run() {
patternView.clearPattern();
}
}, 1 * 2000);
} else {
Toast.makeText(LoginActivity.this, "密码正确,即将登录!",
Toast.LENGTH_SHORT).show();
handler.postDelayed(new Runnable() {
@Override
public void run() {
patternView.clearPattern();
}
}, 1 * 2000);
}
}
});
}
}