Я пытаюсь создать собственную линейную диаграмму, следуя этому учебнику и этому . Все работает нормально, но когда я перетаскиваю палец на графике, я хочу показать значение в текущей позиции (приложение с линейными акциями на iOS или приложение Robinhood). Сначала он показывает значение, но его состояние c и не обновляется.
LineChart. js
const d3 = {
scale,
shape,
}
const height = 300
const { width } = Dimensions.get('window')
const verticalPadding = 30
export default function LineChart({ data = exampleData }) {
const minX = minBy(data, el => moment(el.label, 'LT'))
const maxX = maxBy(data, el => moment(el.label, 'LT'))
const minY = minBy(data, el => el.value)
const maxY = maxBy(data, el => el.value)
const scaleX = scaleTime()
.domain([moment(minX.label, 'LT'), moment(maxX.label, 'LT')])
.range([0, width])
const scaleY = scaleLinear()
.domain([minY.value, maxY.value])
.range([height - verticalPadding, verticalPadding])
const line = d3.shape
.line()
.x(d => scaleX(moment(d.label, 'LT')))
.y(d => scaleY(d.value))
.curve(d3.shape.curveBasis)(data)
return (
<View style={styles.container}>
<Svg {...{ width, height }}>
<Path d={line} fill="transparent" stroke={GREEN} strokeWidth="2" />
</Svg>
<View style={{ ...StyleSheet.absoluteFill, width }}>
<Cursor d={line} scaleY={scaleY} scaleX={scaleX} data={data} />
</View>
</View>
)
}
Курсор. js
const { Value } = Animated
const { width } = Dimensions.get('window')
export default ({ d, scaleY, scaleX, data }) => {
const translationX = new Value(0)
const path = parsePath(d)
const length = interpolate(translationX, {
inputRange: [0, width],
outputRange: [0, path.totalLength],
})
const { x, y } = getPointAtLength(path, length)
const translateX = x
const cursorX = sub(x, 4)
const cursorY = sub(y, 4)
const text = scaleY.invert(cursorX.__getValue())
const onGestureEvent = event([
{
nativeEvent: {
x: translationX,
},
},
])
return (
<PanGestureHandler onGestureEvent={onGestureEvent}>
<Animated.View>
<Animated.View style={{ transform: [{ translateX }], ...styles.label }}>
<Animated.Text style={{ color: 'white' }}>{text}</Animated.Text>
</Animated.View>
<Animated.View style={[styles.line, { transform: [{ translateX }] }]} />
<Animated.View
style={[
styles.cursor,
{ transform: [{ translateX: cursorX, translateY: cursorY }] },
]}
/>
</Animated.View>
</PanGestureHandler>
)
}
Это результат кода выше:
Редактировать Вот ссылка на закуску: https://snack.expo.io/@clytras / заинтригованный трюфель