ヘッダーサイズを固定できるように
This commit is contained in:
parent
639c2e126d
commit
b9dcd6f8e5
BIN
assets/configuration/train_original_small.jpg
Normal file
BIN
assets/configuration/train_original_small.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 100 KiB |
@ -1,6 +1,7 @@
|
|||||||
import { ScrollView, View, Animated, LayoutAnimation } from "react-native";
|
import { ScrollView, View, Animated, LayoutAnimation } from "react-native";
|
||||||
import React, { useMemo, useState } from "react";
|
import React, { useEffect, useMemo, useState, useLayoutEffect } from "react";
|
||||||
import { useScrollHandlers } from "react-native-actions-sheet";
|
import { useScrollHandlers } from "react-native-actions-sheet";
|
||||||
|
import { AS } from "../storageControl";
|
||||||
|
|
||||||
export const DynamicHeaderScrollView = (props) => {
|
export const DynamicHeaderScrollView = (props) => {
|
||||||
const {
|
const {
|
||||||
@ -13,7 +14,30 @@ export const DynamicHeaderScrollView = (props) => {
|
|||||||
styles,
|
styles,
|
||||||
from,
|
from,
|
||||||
} = props;
|
} = props;
|
||||||
|
const [headerSize, setHeaderSize] = useState("default");
|
||||||
|
useLayoutEffect(() => {
|
||||||
|
AS.getItem("headerSize")
|
||||||
|
.then((res) => {
|
||||||
|
if (res) {
|
||||||
|
setHeaderSize(res);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch((e) => {
|
||||||
|
AS.setItem("headerSize", "default");
|
||||||
|
});
|
||||||
|
}, []);
|
||||||
|
useEffect(() => {
|
||||||
|
switch (headerSize) {
|
||||||
|
case "small":
|
||||||
|
setHeaderVisible(true);
|
||||||
|
return;
|
||||||
|
case "big":
|
||||||
|
case "default":
|
||||||
|
default:
|
||||||
|
setHeaderVisible(false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}, [headerSize]);
|
||||||
const viewHeader = useMemo(() => {
|
const viewHeader = useMemo(() => {
|
||||||
switch (from) {
|
switch (from) {
|
||||||
case "AllTrainDiagramView":
|
case "AllTrainDiagramView":
|
||||||
@ -25,7 +49,7 @@ export const DynamicHeaderScrollView = (props) => {
|
|||||||
}
|
}
|
||||||
}, [from]);
|
}, [from]);
|
||||||
|
|
||||||
const Max_Header_Height = viewHeader ? 0 : 200;
|
const Max_Header_Height = headerSize == "small" ? 0 : viewHeader ? 0 : 200;
|
||||||
const Min_Header_Height = viewHeader ? 0 : 80;
|
const Min_Header_Height = viewHeader ? 0 : 80;
|
||||||
|
|
||||||
const Scroll_Distance = Max_Header_Height - Min_Header_Height;
|
const Scroll_Distance = Max_Header_Height - Min_Header_Height;
|
||||||
@ -87,13 +111,24 @@ export const DynamicHeaderScrollView = (props) => {
|
|||||||
const [headerVisible, setHeaderVisible] = useState(false);
|
const [headerVisible, setHeaderVisible] = useState(false);
|
||||||
|
|
||||||
const onScroll = (event) => {
|
const onScroll = (event) => {
|
||||||
const scrollY = event.nativeEvent.contentOffset.y;
|
switch (headerSize) {
|
||||||
if (Scroll_Distance < scrollY == headerVisible) return;
|
case "big":
|
||||||
LayoutAnimation.configureNext({
|
setHeaderVisible(false);
|
||||||
duration: 100,
|
return;
|
||||||
update: { type: "easeOut" },
|
case "small":
|
||||||
});
|
setHeaderVisible(true);
|
||||||
setHeaderVisible(Scroll_Distance < scrollY);
|
return;
|
||||||
|
case "default":
|
||||||
|
default:
|
||||||
|
const scrollY = event.nativeEvent.contentOffset.y;
|
||||||
|
if (Scroll_Distance < scrollY == headerVisible) return;
|
||||||
|
LayoutAnimation.configureNext({
|
||||||
|
duration: 100,
|
||||||
|
update: { type: "easeOut" },
|
||||||
|
});
|
||||||
|
setHeaderVisible(Scroll_Distance < scrollY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
@ -2,6 +2,7 @@ import React from "react";
|
|||||||
import { View, Text, TouchableOpacity, ScrollView } from "react-native";
|
import { View, Text, TouchableOpacity, ScrollView } from "react-native";
|
||||||
import { SwitchArea } from "../atom/SwitchArea";
|
import { SwitchArea } from "../atom/SwitchArea";
|
||||||
import { CheckBox } from "react-native-elements";
|
import { CheckBox } from "react-native-elements";
|
||||||
|
import { TripleSwitchArea } from "../atom/TripleSwitchArea";
|
||||||
|
|
||||||
export const LayoutSettings = ({
|
export const LayoutSettings = ({
|
||||||
navigate,
|
navigate,
|
||||||
@ -17,6 +18,8 @@ export const LayoutSettings = ({
|
|||||||
setTrainMenu,
|
setTrainMenu,
|
||||||
trainPosition,
|
trainPosition,
|
||||||
setTrainPosition,
|
setTrainPosition,
|
||||||
|
headerSize,
|
||||||
|
setHeaderSize,
|
||||||
}) => {
|
}) => {
|
||||||
return (
|
return (
|
||||||
<View style={{ height: "100%", backgroundColor: "#0099CC" }}>
|
<View style={{ height: "100%", backgroundColor: "#0099CC" }}>
|
||||||
@ -106,12 +109,34 @@ export const LayoutSettings = ({
|
|||||||
trueImage={require("../../assets/configuration/train_original.jpg")}
|
trueImage={require("../../assets/configuration/train_original.jpg")}
|
||||||
/>
|
/>
|
||||||
{trainMenu == "true" && (
|
{trainMenu == "true" && (
|
||||||
<SimpleSwitch
|
<>
|
||||||
bool={trainPosition}
|
<TripleSwitchArea
|
||||||
setBool={setTrainPosition}
|
str={"ヘッダーサイズ"}
|
||||||
color="red"
|
bool={headerSize}
|
||||||
str="列車の現在位置をアイコン表示"
|
setBool={setHeaderSize}
|
||||||
/>
|
firstItem={{
|
||||||
|
firstImage: require("../../assets/configuration/train_original_small.jpg"),
|
||||||
|
firstText: "小固定",
|
||||||
|
firstValue: "small",
|
||||||
|
}}
|
||||||
|
secondItem={{
|
||||||
|
secondImage: require("../../assets/configuration/train_original.jpg"),
|
||||||
|
secondText: "既定(可変)",
|
||||||
|
secondValue: "default",
|
||||||
|
}}
|
||||||
|
thirdItem={{
|
||||||
|
thirdImage: require("../../assets/configuration/train_original.jpg"),
|
||||||
|
thirdText: "大固定",
|
||||||
|
thirdValue: "big",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<SimpleSwitch
|
||||||
|
bool={trainPosition}
|
||||||
|
setBool={setTrainPosition}
|
||||||
|
color="red"
|
||||||
|
str="列車の現在位置をアイコン表示"
|
||||||
|
/>
|
||||||
|
</>
|
||||||
)}
|
)}
|
||||||
</View>
|
</View>
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
|
@ -32,6 +32,7 @@ export default function Setting(props) {
|
|||||||
const [usePDFView, setUsePDFView] = useState(false);
|
const [usePDFView, setUsePDFView] = useState(false);
|
||||||
const [trainMenu, setTrainMenu] = useState(false);
|
const [trainMenu, setTrainMenu] = useState(false);
|
||||||
const [trainPosition, setTrainPosition] = useState(false);
|
const [trainPosition, setTrainPosition] = useState(false);
|
||||||
|
const [headerSize, setHeaderSize] = useState("default");
|
||||||
useLayoutEffect(() => {
|
useLayoutEffect(() => {
|
||||||
AS.getItem("iconSwitch").then(setIconSetting);
|
AS.getItem("iconSwitch").then(setIconSetting);
|
||||||
AS.getItem("mapSwitch").then(setMapSwitch);
|
AS.getItem("mapSwitch").then(setMapSwitch);
|
||||||
@ -39,6 +40,7 @@ export default function Setting(props) {
|
|||||||
AS.getItem("usePDFView").then(setUsePDFView);
|
AS.getItem("usePDFView").then(setUsePDFView);
|
||||||
AS.getItem("trainSwitch").then(setTrainMenu);
|
AS.getItem("trainSwitch").then(setTrainMenu);
|
||||||
AS.getItem("trainPositionSwitch").then(setTrainPosition);
|
AS.getItem("trainPositionSwitch").then(setTrainPosition);
|
||||||
|
AS.getItem("headerSize").then(setHeaderSize);
|
||||||
}, []);
|
}, []);
|
||||||
const testNFC = async () => {
|
const testNFC = async () => {
|
||||||
const result = await ExpoFelicaReader.scan();
|
const result = await ExpoFelicaReader.scan();
|
||||||
@ -52,6 +54,7 @@ export default function Setting(props) {
|
|||||||
AS.setItem("usePDFView", usePDFView.toString()),
|
AS.setItem("usePDFView", usePDFView.toString()),
|
||||||
AS.setItem("trainSwitch", trainMenu.toString()),
|
AS.setItem("trainSwitch", trainMenu.toString()),
|
||||||
AS.setItem("trainPositionSwitch", trainPosition.toString()),
|
AS.setItem("trainPositionSwitch", trainPosition.toString()),
|
||||||
|
AS.setItem("headerSize", headerSize),
|
||||||
]).then(() => Updates.reloadAsync());
|
]).then(() => Updates.reloadAsync());
|
||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
@ -115,6 +118,8 @@ export default function Setting(props) {
|
|||||||
setTrainPosition={setTrainPosition}
|
setTrainPosition={setTrainPosition}
|
||||||
testNFC={testNFC}
|
testNFC={testNFC}
|
||||||
updateAndReload={updateAndReload}
|
updateAndReload={updateAndReload}
|
||||||
|
headerSize={headerSize}
|
||||||
|
setHeaderSize={setHeaderSize}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</Stack.Screen>
|
</Stack.Screen>
|
||||||
|
52
components/atom/TripleSwitchArea.js
Normal file
52
components/atom/TripleSwitchArea.js
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
import { View, Text, Image, TouchableOpacity } from "react-native";
|
||||||
|
import { SimpleSwitch } from "./SimpleSwitch";
|
||||||
|
export const TripleSwitchArea = ({
|
||||||
|
str,
|
||||||
|
bool,
|
||||||
|
setBool,
|
||||||
|
firstItem: { firstImage, firstText, firstValue },
|
||||||
|
secondItem: { secondImage, secondText, secondValue },
|
||||||
|
thirdItem: { thirdImage, thirdText, thirdValue },
|
||||||
|
}) => {
|
||||||
|
return (
|
||||||
|
<View style={{ flexDirection: "column", padding: 10 }}>
|
||||||
|
<Text
|
||||||
|
style={{
|
||||||
|
fontSize: 25,
|
||||||
|
alignItems: "center",
|
||||||
|
alignContent: "center",
|
||||||
|
textAlign: "center",
|
||||||
|
textAlignVertical: "center",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{str}
|
||||||
|
</Text>
|
||||||
|
<View style={{ flexDirection: "row", padding: 10 }}>
|
||||||
|
<SimpleSwitch
|
||||||
|
bool={bool}
|
||||||
|
setBool={setBool}
|
||||||
|
color="red"
|
||||||
|
value={firstValue}
|
||||||
|
image={firstImage}
|
||||||
|
subText={firstText}
|
||||||
|
/>
|
||||||
|
<SimpleSwitch
|
||||||
|
bool={bool}
|
||||||
|
setBool={setBool}
|
||||||
|
color="red"
|
||||||
|
value={secondValue}
|
||||||
|
image={secondImage}
|
||||||
|
subText={secondText}
|
||||||
|
/>
|
||||||
|
<SimpleSwitch
|
||||||
|
bool={bool}
|
||||||
|
setBool={setBool}
|
||||||
|
color="red"
|
||||||
|
value={thirdValue}
|
||||||
|
image={thirdImage}
|
||||||
|
subText={thirdText}
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user