效果图如下,大家感觉不错请参考实现代码
具体代码如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
private void setGesturePassword() { toggleMore.setOnCheckedChangeListener( new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { // UIUtils.toast("开启了手势密码", false); // sp.edit().putBoolean("isOpen", true).commit(); String inputCode = sp.getString( "inputCode" , "" ); if (TextUtils.isEmpty(inputCode)) { //之前没有设置过 new AlertDialog.Builder(MoreFragment. this .getActivity()) .setTitle( "设置手势密码" ) .setMessage( "是否现在设置手势密码" ) .setPositiveButton( "确定" , new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { UIUtils.toast( "现在设置手势密码" , false ); sp.edit().putBoolean( "isOpen" , true ).commit(); // toggleMore.setChecked(true); //开启新的activity: ((BaseActivity) MoreFragment. this .getActivity()).goToActivity(GestureEditActivity. class , null ); } }) .setNegativeButton( "取消" , new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { UIUtils.toast( "取消了现在设置手势密码" , false ); sp.edit().putBoolean( "isOpen" , false ).commit(); toggleMore.setChecked( false ); } }) .show(); } else { UIUtils.toast( "开启手势密码" , false ); sp.edit().putBoolean( "isOpen" , true ).commit(); // toggleMore.setChecked(true); } } else { UIUtils.toast( "关闭了手势密码" , false ); sp.edit().putBoolean( "isOpen" , false ).commit(); // toggleMore.setChecked(false); } } }); } private void resetGesture() { tvMoreReset.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { boolean checked = toggleMore.isChecked(); if (checked) { ((BaseActivity) MoreFragment. this .getActivity()).goToActivity(GestureEditActivity. class , null ); } else { UIUtils.toast( "手势密码操作已关闭,请开启后再设置" , false ); } } }); } |
GestureEditActivity:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.text.Html; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.FrameLayout; import android.widget.TextView; import android.widget.Toast; import com.atguigu.gesturelock.widget.GestureContentView; import com.atguigu.gesturelock.widget.GestureDrawline; import com.atguigu.gesturelock.widget.LockIndicator; import com.atguigu.p2pinvest0828.R; public class GestureEditActivity extends Activity implements View.OnClickListener { /** * 手机号码 */ public static final String PARAM_PHONE_NUMBER = "PARAM_PHONE_NUMBER" ; /** * 意图 */ public static final String PARAM_INTENT_CODE = "PARAM_INTENT_CODE" ; /** * 首次提示绘制手势密码,可以选择跳过 */ public static final String PARAM_IS_FIRST_ADVICE = "PARAM_IS_FIRST_ADVICE" ; private TextView mTextTitle; private TextView mTextCancel; private LockIndicator mLockIndicator; private TextView mTextTip; private FrameLayout mGestureContainer; private GestureContentView mGestureContentView; private TextView mTextReset; private String mParamSetUpcode = null ; private String mParamPhoneNumber; private boolean mIsFirstInput = true ; private String mFirstPassword = null ; private String mConfirmPassword = null ; private int mParamIntentCode; private SharedPreferences mSharedPreferences = null ; @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_gesture_edit); setUpViews(); setUpListeners(); } private void setUpViews() { mTextTitle = (TextView) findViewById(R.id.text_title); mTextCancel = (TextView) findViewById(R.id.text_cancel); mTextReset = (TextView) findViewById(R.id.text_reset); mTextReset.setClickable( false ); mLockIndicator = (LockIndicator) findViewById(R.id.lock_indicator); mTextTip = (TextView) findViewById(R.id.text_tip); mGestureContainer = (FrameLayout) findViewById(R.id.gesture_container); mSharedPreferences = this .getSharedPreferences( "secret_protect" , Context.MODE_PRIVATE); // 初始化一个显示各个点的viewGroup mGestureContentView = new GestureContentView( this , false , "" , new GestureDrawline.GestureCallBack() { @Override public void onGestureCodeInput(String inputCode) { if (!isInputPassValidate(inputCode)) { mTextTip.setText(Html.fromHtml( "<font color='#c70c1e'>最少链接4个点, 请重新输入</font>" )); mGestureContentView.clearDrawlineState(0L); return ; } if (mIsFirstInput) { mFirstPassword = inputCode; updateCodeList(inputCode); mGestureContentView.clearDrawlineState(0L); mTextReset.setClickable( true ); mTextReset.setText(getString(R.string.reset_gesture_code)); } else { if (inputCode.equals(mFirstPassword)) { Toast.makeText(GestureEditActivity. this , "设置成功" , Toast.LENGTH_SHORT).show(); mGestureContentView.clearDrawlineState(0L); GestureEditActivity. this .finish(); } else { mTextTip.setText(Html.fromHtml( "<font color='#c70c1e'>与上一次绘制不一致,请重新绘制</font>" )); // 左右移动动画 Animation shakeAnimation = AnimationUtils.loadAnimation(GestureEditActivity. this , R.anim.shake); mTextTip.startAnimation(shakeAnimation); // 保持绘制的线,1.5秒后清除 mGestureContentView.clearDrawlineState(1300L); } } mIsFirstInput = false ; } @Override public void checkedSuccess() { } @Override public void checkedFail() { } }); // 设置手势解锁显示到哪个布局里面 mGestureContentView.setParentView(mGestureContainer); updateCodeList( "" ); } private void setUpListeners() { mTextCancel.setOnClickListener( this ); mTextReset.setOnClickListener( this ); } private void updateCodeList(String inputCode) { // 更新选择的图案 mLockIndicator.setPath(inputCode); mSharedPreferences.edit().putString( "inputCode" ,inputCode).commit(); Log.e( "TAG" , "inputCode = " + inputCode); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.text_cancel: this .finish(); break ; case R.id.text_reset: mIsFirstInput = true ; updateCodeList( "" ); mTextTip.setText(getString(R.string.set_gesture_pattern)); break ; default : break ; } } private boolean isInputPassValidate(String inputPassword) { if (TextUtils.isEmpty(inputPassword) || inputPassword.length() < 4 ) { return false ; } return true ; } } |
我的界面中:
1
2
3
4
5
6
7
|
//判断一下,是否开启了手势密码。如果开启:先输入手势密码 SharedPreferences sp = this .getActivity().getSharedPreferences( "secret_protect" , Context.MODE_PRIVATE); boolean isOpen = sp.getBoolean( "isOpen" , false ); if (isOpen){ ((BaseActivity) this .getActivity()).goToActivity(GestureVerifyActivity. class , null ); return ; } |
GestureVerifyActivity:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.text.Html; import android.text.TextUtils; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.atguigu.gesturelock.widget.GestureContentView; import com.atguigu.gesturelock.widget.GestureDrawline; import com.atguigu.p2pinvest0828.R; public class GestureVerifyActivity extends Activity implements View.OnClickListener { /** 手机号码*/ public static final String PARAM_PHONE_NUMBER = "PARAM_PHONE_NUMBER" ; /** 意图 */ public static final String PARAM_INTENT_CODE = "PARAM_INTENT_CODE" ; private RelativeLayout mTopLayout; private TextView mTextTitle; private TextView mTextCancel; private ImageView mImgUserLogo; private TextView mTextPhoneNumber; private TextView mTextTip; private FrameLayout mGestureContainer; private GestureContentView mGestureContentView; private TextView mTextForget; private TextView mTextOther; private String mParamPhoneNumber; private long mExitTime = 0 ; private int mParamIntentCode; private SharedPreferences mSharedPreferences; @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_gesture_verify); ObtainExtraData(); setUpViews(); setUpListeners(); } private void ObtainExtraData() { mParamPhoneNumber = getIntent().getStringExtra(PARAM_PHONE_NUMBER); mParamIntentCode = getIntent().getIntExtra(PARAM_INTENT_CODE, 0 ); mSharedPreferences = this .getSharedPreferences( "secret_protect" , Context.MODE_PRIVATE); } private void setUpViews() { mTopLayout = (RelativeLayout) findViewById(R.id.top_layout); mTextTitle = (TextView) findViewById(R.id.text_title); mTextCancel = (TextView) findViewById(R.id.text_cancel); mImgUserLogo = (ImageView) findViewById(R.id.user_logo); mTextPhoneNumber = (TextView) findViewById(R.id.text_phone_number); mTextTip = (TextView) findViewById(R.id.text_tip); mGestureContainer = (FrameLayout) findViewById(R.id.gesture_container); mTextForget = (TextView) findViewById(R.id.text_forget_gesture); mTextOther = (TextView) findViewById(R.id.text_other_account); String inputCode = mSharedPreferences.getString( "inputCode" , "1235789" ); // 初始化一个显示各个点的viewGroup mGestureContentView = new GestureContentView( this , true , inputCode, new GestureDrawline.GestureCallBack() { @Override public void onGestureCodeInput(String inputCode) { } @Override public void checkedSuccess() { mGestureContentView.clearDrawlineState(0L); Toast.makeText(GestureVerifyActivity. this , "密码正确" , Toast.LENGTH_SHORT).show(); GestureVerifyActivity. this .finish(); } @Override public void checkedFail() { mGestureContentView.clearDrawlineState(1300L); mTextTip.setVisibility(View.VISIBLE); mTextTip.setText(Html.fromHtml( "<font color='#c70c1e'>密码错误</font>" )); // 左右移动动画 Animation shakeAnimation = AnimationUtils.loadAnimation(GestureVerifyActivity. this , R.anim.shake); mTextTip.startAnimation(shakeAnimation); } }); // 设置手势解锁显示到哪个布局里面 mGestureContentView.setParentView(mGestureContainer); } private void setUpListeners() { mTextCancel.setOnClickListener( this ); mTextForget.setOnClickListener( this ); mTextOther.setOnClickListener( this ); } private String getProtectedMobile(String phoneNumber) { if (TextUtils.isEmpty(phoneNumber) || phoneNumber.length() < 11 ) { return "" ; } StringBuilder builder = new StringBuilder(); builder.append(phoneNumber.subSequence( 0 , 3 )); builder.append( "****" ); builder.append(phoneNumber.subSequence( 7 , 11 )); return builder.toString(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.text_cancel: this .finish(); break ; default : break ; } } } |
总结
以上所述是小编给大家介绍的Android手势密码--设置和校验功能的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:https://www.cnblogs.com/ganchuanpu/archive/2018/05/07/9005877.html