Android 手势解锁一个超级易用的github开源库

前言:

在github仓库上看到一个简单易用的Android 手势解锁开源库,简洁易用,故记录下来。

github开源库地址:https://github.com/aritraroy/PatternLockView

  • 使用效果:

设置密码为:24678。当输入错误,颜色为红色,输入正确为绿色(颜色可自定义),在类中有对应的回调事件。


使用步骤:

1.添加依赖

在app-->gradle 先添加依赖后同步。

dependencies {
   
    /* 其他依赖*/


    /*手势解锁依赖:两个*/
    implementation 'com.andrognito.patternlockview:patternlockview:1.0.0'
    // Optional, for RxJava2 adapter
    implementation 'com.andrognito.patternlockview:patternlockview-reactive:1.0.0'


}

2.创建一个空的Activity

在这里创建名为:PatternLockViewActivity.java,并自动生成acticity_patttern_lock_view.xml布局文件

  • 布局文件内容如下(可直接复制):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/btn_background"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/profile_image"
        android:layout_width="84dp"
        android:layout_height="84dp"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="50dp"
        android:src="@drawable/ic_logo1"/>

    <TextView
        android:id="@+id/profile_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="36dp"
        android:fontFamily="sans-serif-thin"
        android:gravity="center"
        android:maxLines="1"
        android:text="请输入打开门禁密码"
        android:textColor="@color/white"
        android:textSize="20sp"/>

    <com.andrognito.patternlockview.PatternLockView
        android:id="@+id/patter_lock_view"
        android:layout_width="280dp"
        android:layout_height="280dp"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="16dp"
        app:aspectRatio="square"
        app:aspectRatioEnabled="true"
        app:dotAnimationDuration="150"
        app:dotCount="3"
        app:normalStateColor="@color/white"
        app:correctStateColor="@color/green"
        app:wrongStateColor="@color/pomegranate"
        app:dotSelectedSize="50dp"
        />

<!--    自定义属性-->
<!--     app:dotCount="3"                                        // 更改行(或列)-->
<!--    app:dotNormalSize="12dp"                                // 更改正常状态-->
<!--    app:dotSelectedSize="24dp"                              // 更改选定状态-->
<!--    app:pathWidth="4dp"                                     // 更改路径-->
<!--    app:aspectRatioEnabled="true"                           // 设置视图是否应该遵循自定义宽高比-->
<!--    app:aspectRatio="square"                                // 设置在“square”,“width_bias”,“height_bias”-->
<!--    app:normalStateColor="@color/white"                     // 设置正常状态下图案视图的颜色-->
<!--    app:correctStateColor="@color/primary"                  // 将图案视图的颜色设置为正确状态-->
<!--    app:wrongStateColor="@color/pomegranate"                // 设置错误状态-->
<!--    app:dotAnimationDuration="200"                          // 更改动画点-->
<!--    app:pathEndAnimationDuration="100"                      // 更改路径结束动画的持续时间-->

</LinearLayout>

界面效果如下:

备注:

1.这里需要引入图片和背景资源,也就代码当中的ic_logo1 和 btn_background两张图片,自己找两个放置到res-->drawable文件夹下即可。

2.其实,此时可以试着把它运行在真机上,就已经能正常的显示手势图案了,只是还没有设置回调事件以及其他属性。

  • PatternLockViewActivity.java文件的内容如下:

package com.yuan_giziwits_andorid.UI;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Toast;

import com.andrognito.patternlockview.PatternLockView;
import com.andrognito.patternlockview.listener.PatternLockViewListener;
import com.andrognito.patternlockview.utils.PatternLockUtils;
import com.andrognito.patternlockview.utils.ResourceUtils;
import com.andrognito.rxpatternlockview.RxPatternLockView;
import com.andrognito.rxpatternlockview.events.PatternLockCompleteEvent;
import com.andrognito.rxpatternlockview.events.PatternLockCompoundEvent;
import com.yuan_giziwits_andorid.R;

import java.util.List;

import io.reactivex.functions.Consumer;

public class PatternLockViewActivity extends AppCompatActivity {

    private PatternLockView mPatternLockView;
    @SuppressLint("CheckResult")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //设置为全屏
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        //设置沉浸式状态栏
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        }
        setContentView(R.layout.activity_pattern_lock_view);


//        mPatternLockView.setViewMode(PatternLockView.PatternViewMode.CORRECT);       // 设置当前视图更多
//        mPatternLockView.setInStealthMode(true);                                     // 将模式设置为隐藏模式(隐藏模式绘图)
//        mPatternLockView.setTactileFeedbackEnabled(true);                            //绘制图案时启用振动反馈
//        mPatternLockView.setInputEnabled(false);                                     //完全禁用模式锁定视图中的任何输入
//        mPatternLockView.setDotCount(3);
//        mPatternLockView.setDotNormalSize((int) ResourceUtils.getDimensionInPx(this, R.dimen.pattern_lock_dot_size));
//        mPatternLockView.setDotSelectedSize((int) ResourceUtils.getDimensionInPx(this, R.dimen.pattern_lock_dot_selected_size));
//        mPatternLockView.setPathWidth((int) ResourceUtils.getDimensionInPx(this, R.dimen.pattern_lock_path_width));
//        mPatternLockView.setAspectRatioEnabled(true);
//        mPatternLockView.setAspectRatio(PatternLockView.AspectRatio.ASPECT_RATIO_HEIGHT_BIAS);
//        mPatternLockView.setNormalStateColor(ResourceUtils.getColor(this, R.color.white));
//        mPatternLockView.setCorrectStateColor(ResourceUtils.getColor(this, R.color.primary));
//        mPatternLockView.setWrongStateColor(ResourceUtils.getColor(this, R.color.pomegranate));
//        mPatternLockView.setDotAnimationDuration(150);
//        mPatternLockView.setPathEndAnimationDuration(100);


        //获取控件对象
        mPatternLockView = (PatternLockView) findViewById(R.id.patter_lock_view);
        // n*n大小   3*3
        mPatternLockView.setDotCount(3);
        //没有点击时点的大小
        mPatternLockView.setDotNormalSize((int) ResourceUtils.getDimensionInPx(this, R.dimen.pattern_lock_dot_size));
        //点击时点的大小
        mPatternLockView.setDotSelectedSize((int) ResourceUtils.getDimensionInPx(this, R.dimen.pattern_lock_dot_selected_size));
        //更改路径距离
        mPatternLockView.setPathWidth((int) ResourceUtils.getDimensionInPx(this, R.dimen.pattern_lock_path_width));
        mPatternLockView.setAspectRatioEnabled(true);
        mPatternLockView.setAspectRatio(PatternLockView.AspectRatio.ASPECT_RATIO_HEIGHT_BIAS);
        mPatternLockView.setViewMode(PatternLockView.PatternViewMode.CORRECT);
        mPatternLockView.setDotAnimationDuration(150);
        mPatternLockView.setPathEndAnimationDuration(100);
        mPatternLockView.setInStealthMode(false);
        mPatternLockView.setTactileFeedbackEnabled(true);
        mPatternLockView.setInputEnabled(true);
        mPatternLockView.addPatternLockListener(mPatternLockViewListener);



        RxPatternLockView.patternComplete(mPatternLockView)
                .subscribe(new Consumer<PatternLockCompleteEvent>() {
                    @Override
                    public void accept(PatternLockCompleteEvent patternLockCompleteEvent) throws Exception {
                        Log.d(getClass().getName(), "Complete: " + patternLockCompleteEvent.getPattern().toString());
                    }
                });

        RxPatternLockView.patternChanges(mPatternLockView)
                .subscribe(new Consumer<PatternLockCompoundEvent>() {
                    @Override
                    public void accept(PatternLockCompoundEvent event) throws Exception {
                        if (event.getEventType() == PatternLockCompoundEvent.EventType.PATTERN_STARTED) {
                            Log.d(getClass().getName(), "Pattern drawing started");
                        } else if (event.getEventType() == PatternLockCompoundEvent.EventType.PATTERN_PROGRESS) {
                            Log.d(getClass().getName(), "Pattern progress: " +
                                    PatternLockUtils.patternToString(mPatternLockView, event.getPattern()));
                        } else if (event.getEventType() == PatternLockCompoundEvent.EventType.PATTERN_COMPLETE) {
                            Log.d(getClass().getName(), "Pattern complete: " +
                                    PatternLockUtils.patternToString(mPatternLockView, event.getPattern()));
                        } else if (event.getEventType() == PatternLockCompoundEvent.EventType.PATTERN_CLEARED) {
                            Log.d(getClass().getName(), "Pattern has been cleared");
                        }
                    }
                });

    }

    //设置监听器
    private PatternLockViewListener mPatternLockViewListener = new PatternLockViewListener() {
        @Override
        public void onStarted() {
            Log.d(getClass().getName(), "Pattern drawing started");
        }

        @Override
        public void onProgress(List<PatternLockView.Dot> progressPattern) {
            Log.d(getClass().getName(), "Pattern progress: " +
                    PatternLockUtils.patternToString(mPatternLockView, progressPattern));
        }

        @Override
        public void onComplete(List<PatternLockView.Dot> pattern) {
            Log.d(getClass().getName(), "Pattern complete: " +
                    PatternLockUtils.patternToString(mPatternLockView, pattern));
            //密码
            String paswd = "24678";
            String patternToString = PatternLockUtils.patternToString(mPatternLockView, pattern);
            if(!TextUtils.isEmpty(patternToString)){
                if(patternToString.equals(paswd)){
                    //判断为正确
                    mPatternLockView.setViewMode(PatternLockView.PatternViewMode.CORRECT);
                    Toast.makeText(PatternLockViewActivity.this,"您绘制的密码是:"+patternToString+"\n"+"密码正确,开锁成功",Toast.LENGTH_SHORT).show();

                }else {

                    mPatternLockView.setViewMode(PatternLockView.PatternViewMode.WRONG);
                    Toast.makeText(PatternLockViewActivity.this,"您绘制的密码是:"+patternToString+"\n"+"密码错误,请重新绘制", Toast.LENGTH_SHORT).show();
                }
            }
            //3s后清除图案
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    mPatternLockView.clearPattern();
                }
            },1000);
        }
        @Override
        public void onCleared() {
            Log.d(getClass().getName(), "Pattern has been cleared");
        }
    };
}

备注:可以整个全部复制到工程中,或者一段段复制,没有哪个包,直接(ALT + ENTER)导入即可。

 


上面的两步之后,这个控件就可以正常使用了,超级简单。

其中,大部分函数通过名字就可以判断出功能了。其中最重要的就是监听器了,监听手势的事件。

我们一般比较关心的就是绘制完成后的监听事件,如下

 

小结:

如果只是简单的使用一下,这些功能就已经足够了。这个开源库当然还能自定义一些图案的属性等等,就慢慢挖掘啦。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值