-
-
Notifications
You must be signed in to change notification settings - Fork 297
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
4 changed files
with
212 additions
and
97 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,80 +1,153 @@ | ||
import * as React from 'react'; | ||
import { Dimensions } from 'react-native'; | ||
import { Extrapolate, interpolate } from 'react-native-reanimated'; | ||
import Carousel from 'react-native-reanimated-carousel'; | ||
import { View, Text } from 'react-native-ui-lib'; | ||
import type { TAnimationStyle } from '../../../src/layouts/BaseLayout'; | ||
import { Dimensions, Pressable } from 'react-native'; | ||
import Animated, { | ||
Extrapolate, | ||
interpolate, | ||
interpolateColor, | ||
useAnimatedStyle, | ||
useSharedValue, | ||
withTiming, | ||
} from 'react-native-reanimated'; | ||
import Carousel, { ICarouselInstance } from 'react-native-reanimated-carousel'; | ||
import { Colors, View } from 'react-native-ui-lib'; | ||
import SButton from '../components/SButton'; | ||
import { ElementsText } from '../constants'; | ||
import { useToggleButton } from '../hooks/useToggleButton'; | ||
|
||
const window = Dimensions.get('window'); | ||
const PAGE_WIDTH = 40; | ||
const PAGE_WIDTH = 60; | ||
const PAGE_HEIGHT = 40; | ||
const DATA = ['鍛ㄤ竴', '鍛ㄤ簩', '鍛ㄤ笁', '鍛ㄥ洓', '鍛ㄤ簲', '鍛ㄥ叚', '鍛ㄦ棩']; | ||
|
||
function Index() { | ||
const r = React.useRef<ICarouselInstance>(null); | ||
const AutoPLay = useToggleButton({ | ||
defaultValue: false, | ||
buttonTitle: ElementsText.AUTOPLAY, | ||
}); | ||
|
||
const animationStyle: TAnimationStyle = React.useCallback( | ||
(value: number) => { | ||
'worklet'; | ||
|
||
const translateX = interpolate( | ||
value, | ||
[-1, 0, 1], | ||
[-PAGE_WIDTH, 0, PAGE_WIDTH] | ||
); | ||
|
||
const opacity = interpolate( | ||
value, | ||
[-1, 0, 1], | ||
[0.5, 1, 0.5], | ||
Extrapolate.CLAMP | ||
); | ||
|
||
const scale = interpolate( | ||
value, | ||
[-1, 0, 1], | ||
[0.8, 1.4, 0.8], | ||
Extrapolate.CLAMP | ||
); | ||
|
||
return { | ||
transform: [{ translateX }, { scale }], | ||
opacity, | ||
}; | ||
}, | ||
[] | ||
); | ||
|
||
return ( | ||
<View style={{ flex: 1 }}> | ||
<Carousel | ||
loop={false} | ||
<View style={{ marginVertical: 100 }}> | ||
<Carousel | ||
ref={r} | ||
loop={false} | ||
style={{ | ||
width: window.width, | ||
height: PAGE_HEIGHT, | ||
justifyContent: 'center', | ||
alignItems: 'center', | ||
borderBottomWidth: 1, | ||
borderBottomColor: Colors.blue30, | ||
}} | ||
width={PAGE_WIDTH} | ||
height={PAGE_HEIGHT} | ||
data={DATA} | ||
renderItem={({ item, animationValue }) => { | ||
return ( | ||
<Item | ||
animationValue={animationValue} | ||
label={item} | ||
onPress={() => | ||
r.current?.scrollTo(animationValue.value) | ||
} | ||
/> | ||
); | ||
}} | ||
autoPlay={AutoPLay.status} | ||
/> | ||
</View> | ||
{AutoPLay.button} | ||
<View | ||
style={{ | ||
width: window.width, | ||
justifyContent: 'center', | ||
alignItems: 'center', | ||
paddingVertical: 110, | ||
}} | ||
width={PAGE_WIDTH} | ||
height={PAGE_HEIGHT} | ||
data={['鍛ㄤ竴', '鍛ㄤ簩', '鍛ㄤ笁', '鍛ㄥ洓', '鍛ㄤ簲', '鍛ㄥ叚', '鍛ㄦ棩']} | ||
renderItem={({ item }) => { | ||
return ( | ||
<View center height={'100%'}> | ||
<Text color={'#26292E'}>{item}</Text> | ||
</View> | ||
); | ||
marginTop: 24, | ||
flexDirection: 'row', | ||
justifyContent: 'space-evenly', | ||
}} | ||
autoPlay={AutoPLay.status} | ||
customAnimation={animationStyle} | ||
/> | ||
{AutoPLay.button} | ||
> | ||
<SButton onPress={() => r.current?.prev()}>{'Prev'}</SButton> | ||
<SButton onPress={() => r.current?.next()}>{'Next'}</SButton> | ||
</View> | ||
</View> | ||
); | ||
} | ||
|
||
export default Index; | ||
|
||
interface Props { | ||
animationValue: Animated.SharedValue<number>; | ||
label: string; | ||
onPress?: () => void; | ||
} | ||
|
||
const Item: React.FC<Props> = (props) => { | ||
const { animationValue, label, onPress } = props; | ||
|
||
const translateY = useSharedValue(0); | ||
|
||
const containerStyle = useAnimatedStyle(() => { | ||
const opacity = interpolate( | ||
animationValue.value, | ||
[-1, 0, 1], | ||
[0.5, 1, 0.5], | ||
Extrapolate.CLAMP | ||
); | ||
|
||
return { | ||
opacity, | ||
}; | ||
}, [animationValue]); | ||
|
||
const labelStyle = useAnimatedStyle(() => { | ||
const scale = interpolate( | ||
animationValue.value, | ||
[-1, 0, 1], | ||
[1, 1.25, 1], | ||
Extrapolate.CLAMP | ||
); | ||
|
||
const color = interpolateColor( | ||
animationValue.value, | ||
[-1, 0, 1], | ||
[Colors.grey30, Colors.blue30, Colors.grey30] | ||
); | ||
|
||
return { | ||
transform: [{ scale }, { translateY: translateY.value }], | ||
color, | ||
}; | ||
}, [animationValue, translateY]); | ||
|
||
const onPressIn = React.useCallback(() => { | ||
translateY.value = withTiming(-8, { duration: 250 }); | ||
}, [translateY]); | ||
|
||
const onPressOut = React.useCallback(() => { | ||
translateY.value = withTiming(0, { duration: 250 }); | ||
}, [translateY]); | ||
|
||
return ( | ||
<Pressable | ||
onPress={onPress} | ||
onPressIn={onPressIn} | ||
onPressOut={onPressOut} | ||
> | ||
<Animated.View | ||
style={[ | ||
{ | ||
height: '100%', | ||
alignItems: 'center', | ||
justifyContent: 'center', | ||
}, | ||
containerStyle, | ||
]} | ||
> | ||
<Animated.Text | ||
style={[{ fontSize: 18, color: '#26292E' }, labelStyle]} | ||
> | ||
{label} | ||
</Animated.Text> | ||
</Animated.View> | ||
</Pressable> | ||
); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.