|
4 | 4 | * Converted to Typescript on 14/07/2020. |
5 | 5 | * Converted to Functional component. on 21/09/2021 |
6 | 6 | */ |
7 | | -import React, { useEffect, useState } from 'react'; |
| 7 | +import React, { useEffect, useMemo, useState } from 'react'; |
8 | 8 | import { Animated } from 'react-native'; |
9 | 9 | import { usePrevious } from 'react-use'; |
10 | 10 | import EmptyDot from './EmptyDot'; |
@@ -60,47 +60,52 @@ const Dot: React.FC<{ |
60 | 60 | }).start(); |
61 | 61 | }, [animVal, animate, prevType, type]); |
62 | 62 |
|
| 63 | + const animStyle = useMemo(() => { |
| 64 | + const size = animVal.interpolate({ |
| 65 | + inputRange: [0, 1], |
| 66 | + outputRange: [ |
| 67 | + (prevType?.size || 3) * props.sizeRatio, |
| 68 | + type.size * props.sizeRatio, |
| 69 | + ], |
| 70 | + }); |
| 71 | + return { |
| 72 | + width: size, |
| 73 | + height: size, |
| 74 | + borderRadius: animVal.interpolate({ |
| 75 | + inputRange: [0, 1], |
| 76 | + outputRange: [ |
| 77 | + (prevType?.size || 3) * props.sizeRatio * 0.5, |
| 78 | + type.size * props.sizeRatio * 0.5, |
| 79 | + ], |
| 80 | + }), |
| 81 | + opacity: animVal.interpolate({ |
| 82 | + inputRange: [0, 1], |
| 83 | + outputRange: [prevType?.opacity || 0.2, type.opacity], |
| 84 | + }), |
| 85 | + }; |
| 86 | + }, [ |
| 87 | + animVal, |
| 88 | + prevType?.opacity, |
| 89 | + prevType?.size, |
| 90 | + props.sizeRatio, |
| 91 | + type.opacity, |
| 92 | + type.size, |
| 93 | + ]); |
| 94 | + |
63 | 95 | if (props.curPage < 3) { |
64 | 96 | if (props.idx >= 5) return <EmptyDot sizeRatio={props.sizeRatio} />; |
65 | 97 | } else if (props.curPage < 4) { |
66 | 98 | if (props.idx > 5) return <EmptyDot sizeRatio={props.sizeRatio} />; |
67 | 99 | } |
68 | 100 |
|
69 | | - const opacity = animVal.interpolate({ |
70 | | - inputRange: [0, 1], |
71 | | - outputRange: [prevType?.opacity || 0.2, type.opacity], |
72 | | - }); |
73 | | - |
74 | | - const size = animVal.interpolate({ |
75 | | - inputRange: [0, 1], |
76 | | - outputRange: [ |
77 | | - (prevType?.size || 3) * props.sizeRatio, |
78 | | - type.size * props.sizeRatio, |
79 | | - ], |
80 | | - }); |
81 | | - |
82 | | - const borderRadius = animVal.interpolate({ |
83 | | - inputRange: [0, 1], |
84 | | - outputRange: [ |
85 | | - (prevType?.size || 3) * props.sizeRatio * 0.5, |
86 | | - type.size * props.sizeRatio * 0.5, |
87 | | - ], |
88 | | - }); |
89 | | - const { activeColor } = props; |
90 | | - |
91 | 101 | return ( |
92 | 102 | <Animated.View |
93 | 103 | style={[ |
94 | 104 | { |
95 | | - backgroundColor: activeColor, |
| 105 | + backgroundColor: props.activeColor, |
96 | 106 | margin: 3 * props.sizeRatio, |
97 | 107 | }, |
98 | | - { |
99 | | - width: size, |
100 | | - height: size, |
101 | | - borderRadius: borderRadius, |
102 | | - opacity: opacity, |
103 | | - }, |
| 108 | + animStyle, |
104 | 109 | ]} |
105 | 110 | /> |
106 | 111 | ); |
|
0 commit comments