[Android UI]android-lockpattern图案解锁的实现分享

本文属于学习分享,如有雷同纯属巧合 怎么会有雷同呢?

本着技术分享,学习互助的原则,我在此分享一款已经开源的android 图案解锁的实现。

项目地址:https://code.google.com/p/android-lockpattern/  (考虑到要翻墙,才写了这个demo)

它也是参考了android自带的图案锁的源码而修改的,可以作为app来调用。

先看看实现效果吧!

开始说说这个demo的结构吧,首先下载源码,把android-lockpattern作为lib来使用

1.创建demo,先把haibison.android.lockpattern.LockPatternActivity.java拷到我们的项目里,他就是图案的activity,我们可以自己在里面改逻辑;然后配置AndroidManifest.xml,加上如下的配置

 <!-- 为了避免由于屏幕的旋转而导致activity被系统kill掉加上如下设定 -->
        <activity
            android:name="LockPatternActivity"
            android:configChanges="orientation|screenSize|keyboard|keyboardHidden"
            android:screenOrientation="user"
            android:theme="@style/Alp.42447968.Theme.Dark" >
        </activity>

2.好了我们来看看最简单实惠的主Activity,三个按钮:创建新的图案,比较图案,生成随机图案,具体的功能和使用请看代码,我已经写的很清楚了。

/**
 * demo主界面(习惯)
 * @author jan
 */
public class MainActivity extends Activity implements OnClickListener {
	private static final String TAG = "MainActivity";
	//请求创建一个新的图案
	private static final int REQ_CREATE_PATTERN = 1;
	//比较已有的图案
	private static final int REQ_COMPARE_PATTERN = 2;
	//生成随机的图案(个人感觉没啥用(#--)/ .)
	private static final int REQ_VERIFY_PATTERN = 3;
	//对比测试的密文,代表一个pattern
	private String testChars = "101b2a675e9fb9546336d5b9ef70418b594184f4";
	private Button openLockPatternBtn,compareButton,verifyModeButton;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//lockpattern会使用Sharepreference自动保存密文
		AlpSettings.Security.setAutoSavePattern(this, true);
		//隐身模式:不显示勾画的连接线,默认关闭
		AlpSettings.Display.setStealthMode(this, false);
		//启用自定义的解析方式 默认使用SHA1算法摘要
		//<activity
//	    android:name="com.haibison.android.lockpattern.LockPatternActivity"
//	    	    android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
//	    	    android:screenOrientation="user"
//	    	    android:theme="@style/Alp.42447968.Theme.Dialog.Dark" >
//	    	    <meta-data
//	    	        android:name="encrypterClass"
//	    	        android:value="...full.qualified.name.to.your.LPEncrypter" />
//	    	</activity>

//		AlpSettings.Security.setEncrypterClass(this, LPEncrypter.class);
		openLockPatternBtn = (Button) findViewById(R.id.open_button);
		openLockPatternBtn.setOnClickListener(this);
		compareButton = (Button) findViewById(R.id.compare_button);
		compareButton.setOnClickListener(this);
		verifyModeButton = (Button) findViewById(R.id.verify_button);
		verifyModeButton.setOnClickListener(this);
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		switch (requestCode) {
		case REQ_CREATE_PATTERN:
			if (resultCode == RESULT_OK) {
				char[] pattern = data.getCharArrayExtra(LockPatternActivity.EXTRA_PATTERN);
				StringBuffer buffer = new StringBuffer();
				for(char c:pattern){
					buffer.append(c);
				}
				Log.i(TAG, "result=>"+buffer.toString());
				Toast.makeText(this, "消息摘要:"+buffer, Toast.LENGTH_SHORT).show();
				//test:101b2a675e9fb9546336d5b9ef70418b594184f4
			}
			break;
		case REQ_COMPARE_PATTERN:
		        /*
		         * 注意!有四种可能出现情况的返回结果
		         */
		        switch (resultCode) {
		        case RESULT_OK:
		            //用户通过验证
		        	Log.d(TAG, "user passed");
		            break;
		        case RESULT_CANCELED:
		            // 用户取消
		        	Log.d(TAG, "user cancelled");
		            break;
		        case LockPatternActivity.RESULT_FAILED:
		            //用户多次失败
		        	Log.d(TAG, "user failed");
		            break;
		        case LockPatternActivity.RESULT_FORGOT_PATTERN:
		            // The user forgot the pattern and invoked your recovery Activity.
		        	Log.d(TAG, "user forgot");
		            break;
		        }

		        /*
		         * 在任何情况下,EXTRA_RETRY_COUNT都代表着用户尝试的图案的次数
		         */
		        int retryCount = data.getIntExtra(
		                LockPatternActivity.EXTRA_RETRY_COUNT, 0);
		        Log.i(TAG, "用户尝试了"+retryCount+"次数");

			break;
		}
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		//打开一个新的图案
		case R.id.open_button:
			Intent intent = new Intent(
					LockPatternActivity.ACTION_CREATE_PATTERN, null, this,
					LockPatternActivity.class);
			startActivityForResult(intent, REQ_CREATE_PATTERN);
			break;
		//对指定保存的图案做比较
		case R.id.compare_button:
			char[] savedPattern = testChars.toCharArray();
			Intent compare = new Intent(LockPatternActivity.ACTION_COMPARE_PATTERN, null,
			        this, LockPatternActivity.class);
			compare.putExtra(LockPatternActivity.EXTRA_PATTERN, savedPattern);
			startActivityForResult(compare, REQ_COMPARE_PATTERN);
			break;
		//随机图案
		case R.id.verify_button:
			//设置验证的显示次数,默认是4次
			AlpSettings.Display.setCaptchaWiredDots(this, 9);
			Intent verifyIntent = new Intent(LockPatternActivity.ACTION_VERIFY_CAPTCHA, null,
			        this, LockPatternActivity.class);
			startActivityForResult(verifyIntent, REQ_VERIFY_PATTERN);
			break;
		}
	}
}

3.对于图案锁的默认加密方式是SHA1(Secure Hash Algorithm),传说中的安全哈希算法,感觉和MD5差不多,如果你需要自己实现自己的加解密方式,只要实现haibison.android.lockpattern.util.IEncrypter这个接口,然后设置一下:AlpSettings.Security.setEncrypterClass(this,
LPEncrypter.class);

/**
 * 可提供自定义的加密码方式
 */
public class LPEncrypter implements IEncrypter {

	@Override
	public char[] encrypt(Context context, List<Cell> pattern) {
		//这只是一个简单的demo,用了很二的加密方式,参考而已。
		StringBuilder result = new StringBuilder();
		for (Cell cell : pattern)
			result.append(Integer.toString(cell.getId() + 1)).append('-');

		return result.substring(0, result.length() - 1).toCharArray();
	}

	@Override
	public List<Cell> decrypt(Context context, char[] encryptedPattern) {
		List<Cell> result = Lists.newArrayList();
		String[] ids = new String(encryptedPattern).split("[^0-9]");
		for (String id : ids)
			result.add(Cell.of(Integer.parseInt(id) - 1));

		return result;
	}

}

4.结束,使用起来就这么简单,具体的修改看你的需求,这里不再讨论,最后留下demo下载链接,打开如意门

时间: 2024-11-02 07:52:17

[Android UI]android-lockpattern图案解锁的实现分享的相关文章

Android中图案解锁的设计原理和实现过程

Android中图案解锁 首先要理解图案的实现原理,上一张图: 由上图,可以看出,图案中手势的记录是1-9或0-8的,保存的顺序就是密码,当然有些是可以重复的,为了安全,肯定不能直接存原顺序,一定是要加密处理的,如MD5或Hash散列. (作者: a day a better) 图案解锁中自定义View,是其中最为关键的一部分.下面是自定义LockView的实现,里面的注释写的很详细了. <span style="font-size:14px;">package com.e

Android Lock Pattern 图案解锁

参考链接:http://www.cnblogs.com/dyingbleed/archive/2012/12/03/2800007.html http://blog.csdn.net/way_ping_li/article/details/8925936 Android Lock Pattern 图案解锁,码迷,mamicode.com

Android UI个性style

Android开源项目第一篇--个性化控件(View) ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar.TextView.ScrollView.TimeView.TipView.FlipView.ColorPickView.GraphView.UI Style.其他 Android开源项目第二篇--工具库篇 包括依赖注入.图片缓存.网络相关.数据库ORM工具包.Android公共库.高版本向低版本兼

Android UI相关开源项目库汇总

最近做了一个Android UI相关开源项目库汇总,里面集合了OpenDigg 上的优质的Android开源项目库,方便移动开发人员便捷的找到自己需要的项目工具等,感兴趣的可以到GitHub上给个star. 抽屉菜单 MaterialDrawer ★7337 - 安卓抽屉效果实现方案 Side-Menu.Android ★3865 - 创意边侧菜单 FlowingDrawer ★1744 - 向右滑动流动抽屉效果 SlidingRootNav ★1338 - 仿DrawerLayout的View

Android实战——RxJava2+Retrofit+RxBinding解锁各种新姿势

RxJava2+Retrofit+RxBinding解锁各种新姿势 本篇文章内容包含以下内容 前言 RxJava2的基本介绍 RxJava2观察者模式的介绍 RxJava2观察者模式的使用 RxJava2的基本使用 模拟发送验证码 RxJava2与Retrofit的使用 模拟用户登陆获取用户数据 合并本地与服务器购物车列表 RxJava2与RxBinding的使用 优化搜索请求 优化点击请求 源码下载 结语 前言 作为主流的第三方框架Rx系列,不学习也不行啊,对于初学者来说,可能RxJava看起

Android UI效果实现——滑动模糊渐变效果实现

前言: 大家应该都看到过iOS7解锁屏幕的滑动模糊渐变效果,好了,现在可以把手纸收起来了,今天黄老师就给大家讲一下如何在Android平台上 实现类似的滑动模糊渐变效果,其实方式远比你想像的简单. 目标效果展示: 第一部分:几个前提 说到模糊效果,我们先要了解几个前提 1.原图,指需要被模糊的一张位图 2.模糊,通常是采用指将一个位图的每个像素RGB值都取周围像素的RGB值的平均值,这样就可以产生模糊效果,一般通过高斯函数来实现, 至于Java中的实现方式黄老师就不给大家细讲了,我也不是搞图形算

Android UI设计之&lt;十&gt;自定义ListView,实现QQ空间阻尼下拉刷新和渐变菜单栏效果

转载请注明出处:http://blog.csdn.net/llew2011/article/details/51559694 好久没有写有关UI的博客了,刚刚翻了一下之前的博客,最近一篇有关UI的博客是在2014年写的:Android UI设计之<七>自定义Dialog,实现各种风格效果的对话框,在那篇博客写完后由于公司封闭开发封网以及其它原因致使博客中断至今,中断这么久很是惭愧,后续我会尽量把该写的都补充出来.近来项目有个需求,要做个和QQ空间类似的菜单栏透明度渐变和下拉刷新带有阻尼回弹的效

【转】Android UI系列-----时间、日期、Toasts和进度条Dialog

原文网址:http://www.cnblogs.com/xiaoluo501395377/p/3421727.html 您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内容有任何疑问, 可以通过评论或发邮件的方式联系我: [email protected] / [email protected] 如果需要转载,请注明出处,谢谢!! 本篇随笔将继续学

Android UI学习 - ListView (android.R.layout.simple_list_item_1是个什么东西)

Android UI学习 - ListView 2010-06-20 18:21:35 标签:Android UI 移动开发 ListView ListActivity 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://android.blog.51cto.com/268543/336162 ListActivity ListActivity是一个专门显示ListView的Activity类,它内置了ListView对象,只要我