首頁 > web前端 > js教程 > 主體

在 React Native 中建立流暢的、鍵盤感知的登入畫面

Barbara Streisand
發布: 2024-11-04 11:53:29
原創
330 人瀏覽過

Building a Smooth, Keyboard-Aware Sign-In Screen in React Native

在 React Native 中創建一個優化良好的登入畫面通常涉及處理鍵盤交互,以避免輸入欄位被鍵盤隱藏。在本指南中,我們將逐步建立一個具有動畫調整功能的鍵盤感知登入畫面,利用自訂掛鉤來管理鍵盤偏移高度。我們還將添加標題圖像並組織螢幕以獲得美觀且實用的佈局。

此實現的特點:

  1. 鍵盤感知:螢幕依鍵盤高度調整其位置。
  2. 平滑動畫:鍵盤出現或消失時的動畫轉換。
  3. 可重複使用的自訂掛鉤:動態管理鍵盤高度的 useKeyboardOffsetHeight 掛鉤。

1.自訂Hook:useKeyboardOffsetHeight

自訂鉤子 useKeyboardOffsetHeight 偵聽鍵盤顯示/隱藏事件並返回鍵盤高度,這對於動畫佈局調整至關重要。此掛鉤還確保該功能在 iOS 和 Android 上都能正常運作。

import { useEffect, useState } from 'react';
import { Keyboard } from 'react-native';

export default function useKeyboardOffsetHeight() {
  const [keyboardOffsetHeight, setKeyboardOffsetHeight] = useState(0);

  useEffect(() => {
    const showListener = Keyboard.addListener('keyboardWillShow', (e) => {
      setKeyboardOffsetHeight(e.endCoordinates.height);
    });
    const hideListener = Keyboard.addListener('keyboardWillHide', () => {
      setKeyboardOffsetHeight(0);
    });

    const androidShowListener = Keyboard.addListener('keyboardDidShow', (e) => {
      setKeyboardOffsetHeight(e.endCoordinates.height);
    });
    const androidHideListener = Keyboard.addListener('keyboardDidHide', () => {
      setKeyboardOffsetHeight(0);
    });

    return () => {
      showListener.remove();
      hideListener.remove();
      androidShowListener.remove();
      androidHideListener.remove();
    };
  }, []);

  return keyboardOffsetHeight;
}
登入後複製

2. 主要組件:應用程式

主要元件使用自訂 useKeyboardOffsetHeight 掛鉤和動畫 API 來管理登入表單的平滑過渡。此表單包括電子郵件和密碼欄位、登入按鈕和標題圖像。

import React, { useEffect, useRef, useState } from 'react';
import { Animated, Image, StyleSheet, Text, TextInput, TouchableOpacity, View } from 'react-native';
import useKeyboardOffsetHeight from './useKeyboardOffsetHeight';

const App = () => {
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');
  const keyboardOffsetHeight = useKeyboardOffsetHeight();
  const animatedValue = useRef(new Animated.Value(0)).current;

  const handleSignIn = () => {
    // Handle sign-in logic here
    console.log('Email:', email);
    console.log('Password:', password);
  };

  // Animate view based on keyboard height
  useEffect(() => {
    Animated.timing(animatedValue, {
      toValue: keyboardOffsetHeight ? -keyboardOffsetHeight * 0.5 : 0, // adjust "0.5" as per requirement to adjust scroll position
      duration: 500,
      useNativeDriver: true,
    }).start();
  }, [keyboardOffsetHeight]);

  return (
    <View style={styles.container}>
      <View style={{ flex: 1 }}>
        <Image
          source={{
            uri: 'https://cdn.shopaccino.com/igmguru/articles/Become-React-Native-Developer.png?v=496',
          }}
          style={styles.image}
          resizeMode="cover"
        />
      </View>
      <Animated.ScrollView
        bounces={false}
        keyboardShouldPersistTaps="handled"
        keyboardDismissMode="on-drag"
        style={{ transform: [{ translateY: animatedValue }] }}
        contentContainerStyle={styles.box}
      >
        <Text style={styles.title}>Sign In</Text>
        <TextInput
          style={styles.input}
          placeholder="Email"
          value={email}
          onChangeText={setEmail}
          keyboardType="email-address"
          autoCapitalize="none"
        />
        <TextInput
          style={styles.input}
          placeholder="Password"
          value={password}
          onChangeText={setPassword}
          secureTextEntry
        />
      </Animated.ScrollView>
      <TouchableOpacity style={styles.signInButton} onPress={handleSignIn}>
        <Text style={styles.buttonText}>Sign In</Text>
      </TouchableOpacity>
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    padding: 20,
    backgroundColor: '#f9f9f9',
  },
  image: {
    flex: 1,
    borderRadius: 10,
  },
  box: {
    flex: 1,
    width: '100%',
    backgroundColor: 'lightblue',
    padding: 20,
    borderRadius: 10,
  },
  title: {
    fontSize: 24,
    fontWeight: 'bold',
    textAlign: 'center',
    marginBottom: 20,
  },
  input: {
    height: 50,
    borderColor: '#ddd',
    borderWidth: 1,
    borderRadius: 8,
    paddingHorizontal: 10,
    marginBottom: 15,
    fontSize: 16,
    backgroundColor: '#f9f9f9',
  },
  signInButton: {
    width: '100%',
    marginTop: 20,
    backgroundColor: '#4a90e2',
    borderRadius: 8,
    paddingVertical: 15,
    alignItems: 'center',
    marginBottom: 40,
  },
  buttonText: {
    color: '#fff',
    fontSize: 18,
    fontWeight: 'bold',
  },
});

export default App;
登入後複製

概括

這個鍵盤感知登入畫面透過以下方式提供流暢、使用者友善的體驗:

  • 使用自訂鉤子動態管理鍵盤偏移高度。
  • 套用動畫以在鍵盤處於活動狀態時保持表單可見。
  • 建立具有視覺吸引力的佈局,其中包含圖像標題、樣式良好的輸入欄位和突出的登入按鈕。

透過使用這種方法,您可以創建一個精美且實用的文字輸入 UI,特別是在螢幕空間和使用者與鍵盤的互動是關鍵考慮因素的行動裝置上。此設定可以透過更多表單欄位或功能進行擴展,為任何 React Native 身份驗證流程提供良好的基礎。

以上是在 React Native 中建立流暢的、鍵盤感知的登入畫面的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板