Android手势识别Demo
2016-04-09 20:02
369 查看
//**MainActivity.java** package com.study.geslockdemo; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.TextView; public class MainActivity extends Activity { private TextView tv_ges; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv_ges = (TextView) findViewById(R.id.tv_ges); tv_ges.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, GesActivity.class); startActivity(intent); } }); } }
//**GesActivity.java**,其中重要的是数据的回显 package com.study.geslockdemo; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.view.View.OnClickListener; import android.widget.CheckBox; import android.widget.TextView; import android.widget.Toast; import com.study.geslockdemo.util.SharedPreferenceUtil; public class GesActivity extends Activity { protected static final int VERIFY = 1; protected static final int EDIT = 0; private CheckBox ckLock; private boolean isLock; private boolean setGesPwdSuccess; private boolean verifySuccess; private TextView tv_verityPwd; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ges); ckLock = (CheckBox) findViewById(R.id.lock); tv_verityPwd = (TextView) findViewById(R.id.tv_verityPwd); tv_verityPwd.setClickable(true); tv_verityPwd.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (TextUtils.isEmpty(SharedPreferenceUtil.getStringData( getApplicationContext(), "userGesPwd", ""))) { Toast.makeText(getApplicationContext(), "您还没有设置密码", Toast.LENGTH_SHORT).show(); return; } Intent intent = new Intent(GesActivity.this, GestureVerifyActivity.class); startActivity(intent); } }); // 数据回显 isLock = SharedPreferenceUtil.getBooleanData(this, "isLock", false); setGesPwdSuccess = SharedPreferenceUtil.getBooleanData(this, "setGesPwdSuccess", false); verifySuccess = SharedPreferenceUtil.getBooleanData( getApplicationContext(), "verifySuccess", false); if (isLock) { ckLock.setChecked(true); } else { ckLock.setChecked(false); } ckLock.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (setGesPwdSuccess) { Intent intent = new Intent(GesActivity.this, GestureVerifyActivity.class); startActivityForResult(intent, VERIFY); } else { Intent intent = new Intent(GesActivity.this, GestureEditActivity.class); startActivityForResult(intent, EDIT); } } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); setGesPwdSuccess = SharedPreferenceUtil.getBooleanData(this, "setGesPwdSuccess", false); verifySuccess = SharedPreferenceUtil.getBooleanData( getApplicationContext(), "verifySuccess", false); if (requestCode == EDIT) { if (setGesPwdSuccess) { isLock = !isLock; } } else { if (verifySuccess) { isLock = !isLock; } } ckLock.setChecked(isLock); SharedPreferenceUtil.saveBooleanData(getApplicationContext(), "isLock", isLock); } }
package com.study.geslockdemo; import android.app.Activity; import android.os.Bundle; import android.text.Html; import android.text.TextUtils; import android.view.View; import android.view.View.OnClickListener; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.FrameLayout; import android.widget.TextView; import android.widget.Toast; import com.study.geslockdemo.util.SharedPreferenceUtil; import com.study.geslockdemo.view.GestureContentView; import com.study.geslockdemo.view.GestureDrawline.GestureCallBack; import com.study.geslockdemo.view.LockIndicator; /** * 手势密码设置界面 */ public class GestureEditActivity extends Activity implements 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; @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); // 初始化一个显示各个点的viewGroup mGestureContentView = new GestureContentView(this, false, "", new 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(); // add tcl SharedPreferenceUtil.saveBooleanData( GestureEditActivity.this, "setGesPwdSuccess", true); SharedPreferenceUtil.saveStringData( getApplicationContext(), "userGesPwd", inputCode); 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); } @Override public void onBackPressed() { SharedPreferenceUtil.saveBooleanData(getBaseContext(), "setGesPwdSuccess", false); super.onBackPressed(); } @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; } }
package com.study.geslockdemo; import android.app.Activity; 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.study.geslockdemo.util.SharedPreferenceUtil; import com.study.geslockdemo.view.GestureContentView; import com.study.geslockdemo.view.GestureDrawline.GestureCallBack; /** * * 手势绘制/校验界面 */ public class GestureVerifyActivity extends Activity implements android.view.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; // add tcl private String userGesPwd; @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); // add tcl userGesPwd = SharedPreferenceUtil.getStringData( getApplicationContext(), "userGesPwd", ""); } 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); // 初始化一个显示各个点的viewGroup mGestureContentView = new GestureContentView(this, true, userGesPwd, new GestureCallBack() { @Override public void onGestureCodeInput(String inputCode) { } @Override public void checkedSuccess() { mGestureContentView.clearDrawlineState(0L); Toast.makeText(GestureVerifyActivity.this, "密码正确", 1000) .show(); /** * 2016..tcl */ SharedPreferenceUtil.saveBooleanData( GestureVerifyActivity.this, "verifySuccess", true); // end 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; } } @Override public void onBackPressed() { SharedPreferenceUtil.saveBooleanData(getApplicationContext(), "verifySuccess", false); super.onBackPressed(); } }
这里列出了部分代码,需要源码的联系QQ:912674671或邮箱:tianchenglin@vip.qq.com
相关文章推荐
- [Android] 控件的动态显示和自动消失效果
- [Android] 设计模式-策略模式
- 《Android 开发艺术探索》读书笔记二 Activity的启动模式(launchMode)
- [Android] AIDL浅析
- 【Android学习】View点击事件的分发机制(一)
- Android选择器类库,包括日期时间选择器、单项选择器、地址选择器、颜色选择器、文件目录选择器、数字选择器、星座选择器等
- 结对编程--基于android平台的黄金点游戏
- 《Android 开发艺术探索》读书笔记一 Activity的生命周期
- Android View.setOnclickListener(),View.onTouchEvent(),View.setOnTouchListener()关系源码分析
- Android中的代理模式
- Android中的Service的使用详解
- Android 开发 上传用户头像到服务器的数据库再获取显示
- Android表格自定义控件
- Android 编码规范
- Android退出时创建弹窗对话框
- Android常见的几种RuntimeException
- android性能调优工具TraceView的使用
- 使用Bitmap遍历Assets目录下图片
- Android 中View的绘制机制源代码分析 三
- Android 电池电流,电压信息