Android解锁项目

作者: 爱写代码的小王子 | 来源:发表于2019-11-16 19:14 被阅读0次
1001727.jpg
前言:

小萌(你没看错,就是长了草的小明)今天呢要带给大家的是滑动解锁demo的实现,很炫酷,很简单,写得不好的地方,请见谅~

概述:
  • 环境:Android Studio 3.42
  • 语言:Java
  • 特点:简单,易懂,效果爆炸
展示:
image.png
开始:
布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:id="@+id/rl_container">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/bg"
        android:scaleType="center"/>

</RelativeLayout>

代码

MainActivity

  • 创建圆点
//添加9个圆点
    private void initCircles(int res,int visible){

        //获取图片
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),res);
        //设置圆点与屏幕的左间距
        float pd = dip2x(40);
        //获取屏幕宽度和高度
        Point point = new Point();
        getWindowManager().getDefaultDisplay().getSize(point);
        //获取圆点之间的间距
        float space = (point.x-pd*2-bitmap.getWidth())/2;
        //确定第一个点的x,y坐标
        float x = pd;
        float y = point.y/2- - bitmap.getHeight()-space;
        for(int i=0;i<3;i++){

            for(int j=0;j<3;j++){

                //设置布局属性的方法
                createCircles(res,(int)(x+space*j),(int)(y+i*space), visible);
            }

        }
 int tag=1;
        //设置Tag值,用来表示密码
        for(ImageView iv:normal){
            iv.setTag(tag);
            tag++;
        }

    }
  • 设置圆点的布局属性
 private void createCircles(int res,int left,int top,int visible){

        ImageView iv = new ImageView(this);
        //设置背景
        iv.setBackgroundResource(res);
        //图片是否可见
        iv.setVisibility(visible);
        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        lp.leftMargin = left;
        lp.topMargin = top;
        rl.addView(iv,lp);
        //判断res是正常状态还是选中状态
        if(res == R.drawable.normal){
            normal.add(iv);
        }
        if(res==R.drawable.selected){
            dotsView.add(iv);
        }
    }

  • 获取屏幕分辨率
//获取屏幕分辨率,设置大小实现不同设备的显示效果一致
    private float dip2x(int size){
        return getResources().getDisplayMetrics().density*size;
    }

DrawView

  • 触摸事件记录路径和密码
 //触摸事件保存绘制的路径
    @Override
    public boolean onTouchEvent(MotionEvent event) {

        float x = event.getX();
        float y =event.getY();
        ImageView dot;
        switch (event.getAction()){

            case MotionEvent.ACTION_DOWN:
                dot = outOfCircle(x,y);
                if(dot!=null){
                    dot.setVisibility(VISIBLE);
                    selected.add(dot);
                    //设置起始点
                    start = new Point((int)( dot.getPivotX()+dot.getX()),(int) (dot.getPivotY()+dot.getY()));
                    //密码拼接
                    pwd.append(dot.getTag());
                }
                break;
            case MotionEvent.ACTION_MOVE:
                dot = outOfCircle(x,y);
                //画圆点之间的线
                if(dot==null) {
                end = new Point((int)x,(int)y);
                //刷新
                }else {
                    //判断是否是第一个点
                    if (start == null) {
                        dot.setVisibility(VISIBLE);
                        //设置起始点
                        start = new Point((int) (dot.getPivotX() + dot.getX()), (int) (dot.getPivotY() + dot.getY()));

                    } else {
                        dot.setVisibility(VISIBLE);
                        //记录路径
                        Path path = new Path();
                        path.moveTo(start.x, start.y);
                        path.lineTo((int) (dot.getPivotX() + dot.getX()), (int) (dot.getPivotY() + dot.getY()));
                        paths.add(path);
                        //重新设置起始点
                        start = new Point((int) (dot.getPivotX() + dot.getX()), (int) (dot.getPivotY() + dot.getY()));
                        end = start;
                        //刷新重绘
                        invalidate();
                    }
                    pwd.append(dot.getTag());
                    selected.add(dot);
                }
                break;
            case MotionEvent.ACTION_UP:
                //判断是否第一次滑动
                if(password == null){
                    //第一次滑动,显示标题设置密码
                    password = pwd.toString();
                }
                else{
                    //验证密码
                    if(password.equals(pwd.toString())){
                        //密码输入正确
                    }
                    else{
                        //密码输入错误
                        paint.setColor(Color.RED);
                        invalidate();
                    }
                }
                 clear();
                }

        return true;
    }
  • 绘制路径

    //onDraw方法实现具体绘制功能
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (paths.size()>0){
            for(Path path:paths){
                canvas.drawPath(path,paint);
            }
        }
    }
  • 判断触摸点是否在圆内
 //判断触摸的是否在圆内
    private ImageView outOfCircle(float x,float y){
        for(ImageView dot:dotsView)
        {
            float px = dot.getX();
            float py =dot.getY();
            if((x>=px&&x<=px+dot.getWidth())&&(y>=py&&y<=py+dot.getHeight())){
                return dot;
            }
        }
        return null;
    }
}
  • 初始化画笔
 //初始化画笔
    private void initPaint(){
        //设置抗锯齿
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        //设置画笔颜色
        paint.setColor(Color.MAGENTA);
        //画笔宽度
        paint.setStrokeWidth(20);
        //设置描边
        paint.setStyle(Paint.Style.STROKE);
    }

总结:这个demo主要用到今天和以前学过的知识,包括绘画和布局,当然自己对布局仍然不够熟悉,但是做的项目多了,也慢慢找到感觉了,然后呢这个 demo还没做完,后续会继续完善,感谢大家的阅读,小萌后面仍会继续更新文章,希望讲到的知识能帮助到大家

相关文章

  • Android解锁项目

    前言: 小萌(你没看错,就是长了草的小明)今天呢要带给大家的是滑动解锁demo的实现,很炫酷,很简单,写得不好的地...

  • android实现手机密码验证

    最近回顾android学习的小项目时,又重新写了一遍android解锁项目,从中回顾了很多知识点,比如界面如何搭建...

  • Android-指纹解锁技术

    什么是指纹解锁技术 指纹解锁技术原理理解 指纹解锁技术的优势和缺点 在Android中的应用开发 什么是指纹解锁技...

  • Android10.0 人脸解锁

    学习笔记: 人脸解锁概述 人脸解锁即用户通过注视设备的正面方便地解锁手机或平板。Android 10 为支持人脸解...

  • android 解锁

    解锁步骤: Android9.0unlock 1)先在开发者选项中打开OEM解锁 Setting->System-...

  • Android指纹解锁功能封装

    指纹解锁 Android从6.0版本开始,提供了指纹解锁的api。本文使用api中的FingerprintMana...

  • 快给你的app上锁吧(android图案解锁)

    序言:前两天因为项目的原因,去做了一下仿ios的数字解锁功能,然后写了那篇快给你的app上锁吧(android数字...

  • android指纹解锁

    fingerprint介绍 android指纹解锁,支持Android原生6.0及以上+魅族+三星,借鉴githu...

  • DrawRect绘图实现手势密码控件

    公司项目中除了之前的指纹解锁外,还有手势解锁,这就扯到了手势解锁的功能实现 其实核心就是利用touchBegin,...

  • 项目需求讨论- 让APP知道是用哪个指纹来支付和解锁

    以前我写过相关的指纹解锁的文章: 传送门: 项目需求讨论-APP手势解锁及指纹解锁那时候做的APP解锁是调用系统的...

网友评论

    本文标题:Android解锁项目

    本文链接:https://www.haomeiwen.com/subject/yqgyictx.html