ukryj menu
SPEC
aktualizacja: 2021-12-17 12:10:25
Uwaga: Dzisiaj była aktualizacja Expo
Proszę o :
- usuniecie poprzedniego expo-cli z %AppData%
- ponowne zainstalowanie expo-cli
- oraz aktualizację na telefonie Expo do wersji 2.23.2
- na koniec tworzymy nową aplikację
1. ekran kamery
zainstaluj moduł:
..\expo install expo-camerakopiuj
import
import { Camera } from "expo-camera";kopiuj
konstruktor
constructor(props) {
super(props);
this.state = {
hasCameraPermission: null, // przydzielone uprawnienia do używania kamery
type: Camera.Constants.Type.back, // typ kamery
};
}kopiuj
uprawnienia przydzielamy w funkcji componentDidMount()
let { status } = await Camera.requestCameraPermissionsAsync();
this.setState({ hasCameraPermission: status == 'granted' });kopiuj
kamera - renderowanie warunkowe w zależności od przydzielonych lub nie, uprawnień
render() {
const { hasCameraPermission } = this.state; // podstawienie zmiennej ze state
if (hasCameraPermission == null) {
return <View />;
} else if (hasCameraPermission == false) {
return <Text>brak dostępu do kamery</Text>;
} else {
return (
<View style={{ flex: 1 }}>
<Camera
ref={ref => {
this.camera = ref; // Uwaga: referencja do kamery używana później
}}
style={{ flex: 1 }}
type={this.state.type}>
<View style={{ flex: 1 }}>
{/* tutaj wstaw buttony do obsługi kamery widoczne na skrinach */}
</View>
</Camera>
</View>
);
}
}
kopiuj
zmiana typu kamery - back/front - okrągły button
this.setState({
type: this.state.type === Camera.Constants.Type.back
? Camera.Constants.Type.front
: Camera.Constants.Type.back,
});kopiuj
wykonanie zdjęcia - zaprojektuj okrągły button
zdjęcie można robić pod warunkiem, że kamera jest dostępna, np nie jest zajęta przez inną aplikację w urządzeniu
if (this.camera) {
let foto = await this.camera.takePictureAsync();
let asset = await MediaLibrary.createAssetAsync(foto.uri); // domyślnie zapisuje w folderze DCIM
alert(JSON.stringify(asset, null, 4))
}kopiuj
2. BackHandler
import { Camera } from "expo-camera";kopiuj
konstruktor
constructor(props) {
super(props);
this.state = {
hasCameraPermission: null, // przydzielone uprawnienia do używania kamery
type: Camera.Constants.Type.back, // typ kamery
};
}kopiuj
uprawnienia przydzielamy w funkcji componentDidMount()
let { status } = await Camera.requestCameraPermissionsAsync();
this.setState({ hasCameraPermission: status == 'granted' });kopiuj
kamera - renderowanie warunkowe w zależności od przydzielonych lub nie, uprawnień
render() {
const { hasCameraPermission } = this.state; // podstawienie zmiennej ze state
if (hasCameraPermission == null) {
return <View />;
} else if (hasCameraPermission == false) {
return <Text>brak dostępu do kamery</Text>;
} else {
return (
<View style={{ flex: 1 }}>
<Camera
ref={ref => {
this.camera = ref; // Uwaga: referencja do kamery używana później
}}
style={{ flex: 1 }}
type={this.state.type}>
<View style={{ flex: 1 }}>
{/* tutaj wstaw buttony do obsługi kamery widoczne na skrinach */}
</View>
</Camera>
</View>
);
}
}
kopiuj
zmiana typu kamery - back/front - okrągły button
this.setState({
type: this.state.type === Camera.Constants.Type.back
? Camera.Constants.Type.front
: Camera.Constants.Type.back,
});kopiuj
wykonanie zdjęcia - zaprojektuj okrągły button
zdjęcie można robić pod warunkiem, że kamera jest dostępna, np nie jest zajęta przez inną aplikację w urządzeniu
if (this.camera) {
let foto = await this.camera.takePictureAsync();
let asset = await MediaLibrary.createAssetAsync(foto.uri); // domyślnie zapisuje w folderze DCIM
alert(JSON.stringify(asset, null, 4))
}kopiuj
2. BackHandler
w razie potrzeby możemy obsłużyć zdarzenie naciśnięcia butona back na telefonie
import { BackHandler } from "react-native"kopiuj
w componentDidMount() dodanie listenera
BackHandler.addEventListener("hardwareBackPress", this.handleBackPress);kopiuj
w componentWillUnmount() usunięcie listenera
BackHandler.removeEventListener("hardwareBackPress", this.handleBackPress);kopiuj
własna funkcja obsługująca button back
handleBackPress = () => {
//tutaj wywołanie funkcji odświeżającej gallery, przekazanej w props-ach
//...
//powrót do ekranu poprzedniego
this.props.navigation.goBack()
return true;
}kopiuj
dokumentacja
https://docs.expo.io/versions/latest/sdk/camera/
https://reactnative.dev/docs/backhandler
import { BackHandler } from "react-native"kopiuj
w componentDidMount() dodanie listenera
BackHandler.addEventListener("hardwareBackPress", this.handleBackPress);kopiuj
w componentWillUnmount() usunięcie listenera
BackHandler.removeEventListener("hardwareBackPress", this.handleBackPress);kopiuj
własna funkcja obsługująca button back
handleBackPress = () => {
//tutaj wywołanie funkcji odświeżającej gallery, przekazanej w props-ach
//...
//powrót do ekranu poprzedniego
this.props.navigation.goBack()
return true;
}kopiuj
dokumentacja
https://docs.expo.io/versions/latest/sdk/camera/
https://reactnative.dev/docs/backhandler
oczywiście do odświeżania zdjęć w galerii można wykorzystać znana zdarzenie "focus"
3. Toast
dymek - potwierdzenie wykonania zdjęcia i innych akcji - zamiast alert-a
import { ToastAndroid } from "react-native";kopiuj
w dowolnej funkcji
ToastAndroid.showWithGravity(
'komunikat',
ToastAndroid.SHORT,
ToastAndroid.CENTER
);kopiuj
import { ToastAndroid } from "react-native";kopiuj
w dowolnej funkcji
ToastAndroid.showWithGravity(
'komunikat',
ToastAndroid.SHORT,
ToastAndroid.CENTER
);kopiuj
4. konstrukcja aplikacji, komponenty
Main - ekran główny(przejście do grida galerii)
CircleButton - własny komponent buttona wykorzystany na ekranie kamery
Main - ekran główny(przejście do grida galerii)
Gallery - lista zdjęć
- możliwość zaznaczenia / odznaczenia zdjęć do usunięcia (długie lub krótkie przytrzymanie)
FotoItem - element grida / listy
FotoItem - element grida / listy
- zaznaczanie / odznaczanie
CameraScreen - ekran kamery
CameraScreen - ekran kamery
- wykonanie zdjęcia
- odświeżenie listy zdjęć w galerii
- zmiana kamery przednia/tylna
- odświeżenie listy zdjęć w galerii
- zmiana kamery przednia/tylna
CircleButton - własny komponent buttona wykorzystany na ekranie kamery