如何在Android应用中实现一个手势密码功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
实现思路:
正上方的提示区域,用一个类(LockIndicator.java)来实现,自定义view来绘制9个提示图标;
手势密码绘制区域,用一个类(GestureContentView.java)来实现,它继承自ViewGroup里面, 添加9个ImageView来表示图标, 在onLayout()方法中设置它们的位置;
手势路径绘制, 用一个类(GestureDrawline.java)来实现,复写onTouchEvent()方法,在这个方法里面监听TouchEvent事件: ACTION_DOWN、ACTION_MOVE、ACTION_UP事件,来绘制手势连接不同点之间的路径;
9个点的对象,用一个类(GesturePoint.java)来实现,保存它的位置、状态、背景图片等相关信息;
手势密码的获取,判断手指当前的位置,根据滑动路径经过的点,按顺序保存绘制的点的顺序(这里的点顺序从上到下分别是:1,2,3,4,5,6,7,8,9),不能有重复的点。
三、代码实现步骤:
要用一个类来表示这9个点中的第一个点。里面保留有当前点的上下左右的各个位置等属性
自定义GroupView,用来装9个点,9个点的显示是通过ImageView。复写onLayout这个方法,让点按需求排列
定义一个可以画线的View,复写onTouchEvent方法,在这个方法里面进行画直线的操作
判断用户手指当前的位置,取出当前的位置去与那9个点中的每个点的位置进行比较,如果用户点的位置在某一个点之内,那么当那个点置换背景图片。
具体实现代码如下:
LockIndicator.java 图案提示类
package com.snda.fund.widget; import com.snda.fund.R; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.drawable.Drawable; import android.os.PowerManager; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Log; import android.view.View; public class LockIndicator extends View { private int numRow = 3; // 行 private int numColum = 3; // 列 private int patternWidth = 40; private int patternHeight = 40; private int f = 5; private int g = 5; private int strokeWidth = 3; private Paint paint = null; private Drawable patternNoraml = null; private Drawable patternPressed = null; private String lockPassStr; // 手势密码 public LockIndicator(Context paramContext) { super(paramContext); } public LockIndicator(Context paramContext, AttributeSet paramAttributeSet) { super(paramContext, paramAttributeSet, 0); paint = new Paint(); paint.setAntiAlias(true); paint.setStrokeWidth(strokeWidth); paint.setStyle(Paint.Style.STROKE); patternNoraml = getResources().getDrawable(R.drawable.lock_pattern_node_normal); patternPressed = getResources().getDrawable(R.drawable.lock_pattern_node_pressed); if (patternPressed != null) { patternWidth = patternPressed.getIntrinsicWidth(); patternHeight = patternPressed.getIntrinsicHeight(); this.f = (patternWidth / 4); this.g = (patternHeight / 4); patternPressed.setBounds(0, 0, patternWidth, patternHeight); patternNoraml.setBounds(0, 0, patternWidth, patternHeight); } } @Override protected void onDraw(Canvas canvas) { if ((patternPressed == null) || (patternNoraml == null)) { return; } // 绘制3*3的图标 for (int i = 0; i < numRow; i++) { for (int j = 0; j < numColum; j++) { paint.setColor(-16777216); int i1 = j * patternHeight + j * this.g; int i2 = i * patternWidth + i * this.f; canvas.save(); canvas.translate(i1, i2); String curNum = String.valueOf(numColum * i + (j + 1)); if (!TextUtils.isEmpty(lockPassStr)) { if (lockPassStr.indexOf(curNum) == -1) { // 未选中 patternNoraml.draw(canvas); } else { // 被选中 patternPressed.draw(canvas); } } else { // 重置状态 patternNoraml.draw(canvas); } canvas.restore(); } } } @Override protected void onMeasure(int paramInt1, int paramInt2) { if (patternPressed != null) setMeasuredDimension(numColum * patternHeight + this.g * (-1 + numColum), numRow * patternWidth + this.f * (-1 + numRow)); } public void setPath(String paramString) { lockPassStr = paramString; invalidate(); } }
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1142
183.71 KB下载数642
644.84 KB下载数2755