主要参考了https://github.com/sym900728/LockPattern,谢谢作者!
下载依赖项目
首先在上面网址下载整个项目到本地,我们需要将项目中的lockpattern模块作为module依赖导入到我们项目中,gradle中添加:
implementation project(':lockpattern')
接下来需要把 CreateGestureActivity.java 文件和GestureLoginActivity.java 文件以及对应的布局文件拷贝到自己的项目中,还有项目中的工具类也一并拷贝到项目中。总之就是把demo中需要的资源都拷贝到自己项目中,其他的不需要。
修改代码,打造自己的手势解锁
准备工作做完后就是修改代码,适应自己的需求,以下是我的项目需要的东西,包括用户错误5次后隐藏解锁界面,给一分钟的倒计时,在倒计时onTick中执行一次就把系统时间time1和剩余倒计时time_less存在本地,当用户结束app再打开时,再得到一次系统时间time2,通过比较time2-time1是否小于time_less,小于表示倒计时一分钟还未结束,大于表示倒计时已经结束可以显示解锁图案了,小于就继续显示time_less-(time2-time1)s倒计时。这样就保证了用户清除app后再进入还能继续倒计时。以下是完整代码:
public class GestureLoginActivity extends AppCompatActivity {
private static final String TAG = "LoginGestureActivity";
@BindView(R.id.lockPatternView)
LockPatternView lockPatternView;
@BindView(R.id.messageTv)
TextView messageTv;
@BindView(R.id.forgetGestureBtn)
Button forgetGestureBtn;
@BindView(R.id.tv_username)
TextView tv_username;
@BindView(R.id.portrait)
ImageView img_portrait;
private ACache aCache;
private static final long DELAYTIME = 600l;
private byte[] gesturePassword;
private SharedPreferences sp;
private int erros=0;
private Long times;
private Long times_less;//时间差
private TimeCount timer;
private File file=null;
private String Uri_path="";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_gesture_login);
ButterKnife.bind(this);
this.init();
}
@SuppressLint("ResourceAsColor")
private void init() {
sp= getSharedPreferences("loginUser", Context.MODE_PRIVATE);
Uri_path=sp.getString("path","");
if (!Uri_path.equals("")){
file = new File(Uri_path);
}
times=System.currentTimeMillis();
if (!sp.getBoolean("isError",true)){
if (times-sp