文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何在Android应用中实现一个手势密码功能

2023-05-31 07:13

关注

如何在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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯