Android手势识别Demo

简单界面

设置手势密码

解锁界面

//**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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值