有听说过PatternLockView吗?适用于Android的易于使用,可自定义和Material Design的Pattern Lock视图,下面我们一起来简单的介绍一下手势锁的速成步骤吧:

1.添加依赖:

dependencies {    // other dependencies here        compile 'com.andrognito.patternlockview:patternlockview:1.0.0'    // Optional, for RxJava2 adapter    compile 'com.andrognito.patternlockview:patternlockview-reactive:1.0.0'}

2.XML布局写法:

  

完整XML布局:

<?xml version="1.0" encoding="utf-8"?>            

2.主函数代码:

import android.os.Bundle;import android.support.v7.app.AppCompatActivity;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 java.util.List;import io.reactivex.functions.Consumer;public class MainActivity extends AppCompatActivity {    private PatternLockView mPatternLockView;    private PatternLockViewListener mPatternLockViewListener = new PatternLockViewListener() {        @Override        public void onStarted() {            Log.d(getClass().getName(), "Pattern drawing started");        }        @Override        public void onProgress(List progressPattern) {            Log.d(getClass().getName(), "Pattern progress: " +                    PatternLockUtils.patternToString(mPatternLockView, progressPattern));        }        @Override        public void onComplete(List pattern) {            Log.d(getClass().getName(), "Pattern complete: " +                    PatternLockUtils.patternToString(mPatternLockView, pattern));            //判断是否成功:24678            String mima = "24678";            String patternToString = PatternLockUtils.patternToString(mPatternLockView, pattern);//            Toast.makeText(MainActivity.this,"您绘制的密码是:"+patternToString,Toast.LENGTH_SHORT).show();            if(!TextUtils.isEmpty(patternToString)){                if(patternToString.equals(mima)){                    Toast.makeText(MainActivity.this,"您绘制的密码是:"+patternToString+"\n"+"密码正确,正在进入首页...",Toast.LENGTH_SHORT).show();                }else {                    Toast.makeText(MainActivity.this,"您绘制的密码是:"+patternToString+"\n"+"密码错误,请重新绘制",Toast.LENGTH_SHORT).show();                }            }        }        @Override        public void onCleared() {            Log.d(getClass().getName(), "Pattern has been cleared");        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,                WindowManager.LayoutParams.FLAG_FULLSCREEN);        setContentView(R.layout.activity_main);        mPatternLockView = (PatternLockView) findViewById(R.id.patter_lock_view);        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.setCorrectStateColor(ResourceUtils.getColor(this, R.color.white));        mPatternLockView.setInStealthMode(false);        mPatternLockView.setTactileFeedbackEnabled(true);        mPatternLockView.setInputEnabled(true);        mPatternLockView.addPatternLockListener(mPatternLockViewListener);        RxPatternLockView.patternComplete(mPatternLockView)                .subscribe(new Consumer() {                    @Override                    public void accept(PatternLockCompleteEvent patternLockCompleteEvent) throws Exception {                        Log.d(getClass().getName(), "Complete: " + patternLockCompleteEvent.getPattern().toString());                    }                });        RxPatternLockView.patternChanges(mPatternLockView)                .subscribe(new Consumer() {                    @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");                        }                    }                });    }}

注意的控件的监听方法,然后自己在相应的方法中写符合自己项目的需求逻辑就ok了:

private PatternLockViewListener mPatternLockViewListener = new PatternLockViewListener() {        @Override        public void onStarted() {            Log.d(getClass().getName(), "Pattern drawing started");        }        @Override        public void onProgress(List progressPattern) {            Log.d(getClass().getName(), "Pattern progress: " +                    PatternLockUtils.patternToString(mPatternLockView, progressPattern));        }        @Override        public void onComplete(List pattern) {            Log.d(getClass().getName(), "Pattern complete: " +                    PatternLockUtils.patternToString(mPatternLockView, pattern));        }        @Override        public void onCleared() {            Log.d(getClass().getName(), "Pattern has been cleared");        }    };

3.定制细节介绍:

若您想要自己定制的话,您可以从XML布局向PatternLockView添加各种属性。

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"                      // 更改路径结束动画的持续时间

您还可以以编程方式更改视图的属性,从而对其进行更多控制:

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);

项目下载地址:https://github.com/aritraroy/PatternLockView

 

更多相关文章

  1. google api8
  2. [置顶] Android之Fragment的前世今生(二)
  3. StikkyHeader——为滚动视图添加粘性头部
  4. Android(安卓)约束布局(ConstraintLayout)详解
  5. Android自定义视图控件
  6. Ripple反馈
  7. Android(安卓)RoboGuice 使用指南(8):Provider Bindings
  8. android防新闻循环轮播图效果
  9. 整理 酷炫 Android、Flutter开源UI框架 其他

随机推荐

  1. 大前端1109笔记
  2. 20211109-788331作业
  3. 关闭selint 的方式
  4. 万能码的作用你想不到(安全扫码专业委员会
  5. 云服务器如何通过本地安全策略阻止特定IP
  6. 创建html和常用标签
  7. 1109标签练习
  8. 我的第一个作业
  9. 2021年11月9日作业1
  10. 樱花怎么画?超详细樱花画法步骤!