├── .expo-shared └── assets.json ├── .gitignore ├── App.js ├── LICENSE ├── README.md ├── android ├── app │ ├── BUCK │ ├── build.gradle │ ├── build_defs.bzl │ ├── debug.keystore │ ├── proguard-rules.pro │ └── src │ │ ├── debug │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── bolan9999 │ │ │ └── PatternLock │ │ │ └── ReactNativeFlipper.java │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── bolan9999 │ │ │ └── PatternLock │ │ │ ├── MainActivity.java │ │ │ ├── MainApplication.java │ │ │ └── generated │ │ │ └── BasePackageList.java │ │ └── res │ │ ├── drawable-hdpi │ │ └── splashscreen_image.png │ │ ├── drawable-mdpi │ │ └── splashscreen_image.png │ │ ├── drawable-xhdpi │ │ └── splashscreen_image.png │ │ ├── drawable-xxhdpi │ │ └── splashscreen_image.png │ │ ├── drawable-xxxhdpi │ │ └── splashscreen_image.png │ │ ├── drawable │ │ └── splashscreen.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── values-night │ │ └── colors.xml │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle ├── app.json ├── assets ├── adaptive-icon.png ├── demo.android.gif ├── demo.ios.gif ├── demo.web.gif ├── download-app.png ├── favicon.png ├── icon.png ├── splash.png └── web-experience.png ├── babel.config.js ├── index.js ├── metro.config.js ├── package.json └── src ├── PatternLock.js ├── index.d.ts ├── index.js └── package.json /.expo-shared/assets.json: -------------------------------------------------------------------------------- 1 | { 2 | "12bb71342c6255bbf50437ec8f4441c083f47cdb74bd89160c15e4f43e52a1cb": true, 3 | "40b842e832070c58deac6aa9e08fa459302ee3f9da492c7e77d93d2fbf4a56fd": true 4 | } 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .expo/ 3 | npm-debug.* 4 | *.jks 5 | *.p8 6 | *.p12 7 | *.key 8 | *.mobileprovision 9 | *.orig.* 10 | web-build/ 11 | 12 | # macOS 13 | .DS_Store 14 | 15 | # @generated expo-cli sync-2138f1e3e130677ea10ea873f6d498e3890e677b 16 | # The following patterns were generated by expo-cli 17 | 18 | # OSX 19 | # 20 | .DS_Store 21 | 22 | # Xcode 23 | # 24 | build/ 25 | *.pbxuser 26 | !default.pbxuser 27 | *.mode1v3 28 | !default.mode1v3 29 | *.mode2v3 30 | !default.mode2v3 31 | *.perspectivev3 32 | !default.perspectivev3 33 | xcuserdata 34 | *.xccheckout 35 | *.moved-aside 36 | DerivedData 37 | *.hmap 38 | *.ipa 39 | *.xcuserstate 40 | project.xcworkspace 41 | 42 | # Android/IntelliJ 43 | # 44 | build/ 45 | .idea 46 | .gradle 47 | local.properties 48 | *.iml 49 | *.hprof 50 | 51 | # node.js 52 | # 53 | node_modules/ 54 | npm-debug.log 55 | yarn-error.log 56 | 57 | # BUCK 58 | buck-out/ 59 | \.buckd/ 60 | *.keystore 61 | !debug.keystore 62 | 63 | # Bundle artifacts 64 | *.jsbundle 65 | 66 | # CocoaPods 67 | /ios/Pods/ 68 | 69 | # Expo 70 | .expo/ 71 | web-build/ 72 | yarn.lock 73 | 74 | # @end expo-cli -------------------------------------------------------------------------------- /App.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: 石破天惊 3 | * @email: shanshang130@gmail.com 4 | * @Date: 1985-10-26 16:15:00 5 | * @LastEditTime: 2021-08-05 10:47:59 6 | * @LastEditors: 石破天惊 7 | * @Description: 8 | */ 9 | import { StatusBar } from "expo-status-bar"; 10 | import React, { useState } from "react"; 11 | import { 12 | Animated, 13 | Dimensions, 14 | StyleSheet, 15 | Text, 16 | View, 17 | TouchableOpacity, 18 | Easing, 19 | SafeAreaView, 20 | Platform, 21 | } from "react-native"; 22 | import { PatternLock } from "./src"; 23 | // import { PatternLock } from "@shanshang/react-native-pattern-lock"; 24 | 25 | const screen = Dimensions.get("screen"); 26 | const screenHeight = Math.max(screen.width, screen.height); 27 | 28 | export default function App() { 29 | const [msg, setMsg] = useState(); 30 | const [code, setCode] = useState(""); 31 | const [status, setStatus] = useState(""); 32 | const [modalY] = useState(new Animated.Value(screenHeight)); 33 | const ms = StyleSheet.flatten([ 34 | { transform: [{ translateY: modalY }] }, 35 | styles.modal, 36 | ]); 37 | const modal = { 38 | open: () => 39 | Animated.timing(modalY, { 40 | toValue: 0, 41 | duration: 250, 42 | useNativeDriver: true, 43 | }).start(), 44 | close: () => 45 | Animated.timing(modalY, { 46 | toValue: screenHeight, 47 | duration: 250, 48 | useNativeDriver: true, 49 | }).start(), 50 | }; 51 | const onSet = () => { 52 | setCode(""); 53 | setStatus("setting"); 54 | setMsg("Set pattern lock"); 55 | modal.open(); 56 | }; 57 | const onVerify = () => { 58 | setStatus("verifying"); 59 | setMsg("Draw An Unlock Pattern To Verify"); 60 | modal.open(); 61 | }; 62 | const onCheck = (res) => { 63 | if (status === "setting") { 64 | if (!code) { 65 | setCode(res); 66 | setMsg("Repeat Setting Pattern"); 67 | return true; 68 | } else if (code === res) { 69 | setMsg("Success"); 70 | setTimeout(modal.close, 1000); 71 | return true; 72 | } else { 73 | setMsg("Repeat Error,Set Again"); 74 | return false; 75 | } 76 | } else { 77 | if (code === res) { 78 | setMsg("Success"); 79 | setTimeout(modal.close, 1000); 80 | return true; 81 | } else { 82 | setMsg("Input Error,Please Try Again"); 83 | return false; 84 | } 85 | } 86 | }; 87 | return ( 88 | 89 |