0

Panresponder の使用方法を理解しようとしています。ユーザーがクリックした場所に表示される「十字線」を作成しようとしています。ユーザーの指をたどるようにしたいのですが、今のところ、ユーザーがタップした場所に表示することさえできません。現在は機能していますが、X、Y の値がずれています。私が間違っていることを理解できません。

前のユーザーがどこをクリックしたかは気にしないので、初期オフセットを x:0 と y:0 に設定します。locationX/locationY、pageX/pageY、またはgesture.x0/gesture.y0のすべての組み合わせを試しました。

さらに奇妙なことに、パンハンドラーを含むボックスを少なくとも 1 回クリックした後、ボックスの下をクリックしてパンハンドラーを開始できます。初めてボックス内をクリックする前にボックスの外をクリックすると、パンハンドラーが呼び出されません。

どんな助けでも素晴らしいでしょう

メインファイル

import Line from '../components/Line';

const {width, height} = Dimensions.get('window');

const PanResponderComp = () => {
  const pan = useState(new Animated.ValueXY())[0];
  const [opacity, setOpacity] = useState(0);

  const panResponder = useState(
    PanResponder.create({
      onStartShouldSetPanResponder: () => true,
      // onMoveShouldSetPanResponder: () => true,
      onPanResponderGrant: (e, gesture) => {
        const {locationX, locationY} = e.nativeEvent;
        console.log(locationX);
        console.log(locationY);
        pan.setOffset({x: 0, y: 0});
        pan.setValue({
          x: locationX,
          y: locationY,
        });

        setOpacity(1);
      },
      // onPanResponderMove: (e, gesture) => {
      //   pan.x.setValue(gesture.dx);
      //   pan.y.setValue(gesture.dy);
      // },
      onPanResponderRelease: () => {
        console.log('RELEASED');
        // pan.flattenOffset();
        setOpacity(0);
      },
    }),
  )[0];

  return (
    <View style={styles.container}>
      <View style={styles.chartContainer}>
        <Animated.View
          {...panResponder.panHandlers}
          style={[
            {borderWidth: 2, borderColor: 'green'},
            StyleSheet.absoluteFill,
          ]}>
          <Animated.View
            style={{
              transform: [{translateX: pan.x}],
              opacity: opacity,
              ...StyleSheet.absoluteFill,
            }}>
            <Line y={height} x={0} />
          </Animated.View>
          <Animated.View
            style={{
              transform: [{translateY: pan.y}],
              opacity: opacity,
              ...StyleSheet.absoluteFill,
            }}>
            <Line x={width} y={0} />
          </Animated.View>
        </Animated.View>
      </View>
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    flexDirection: 'column',
    alignItems: 'center',
    justifyContent: 'center',
  },
  titleText: {
    fontSize: 14,
    lineHeight: 24,
    fontWeight: 'bold',
  },
  chartContainer: {
    width: 400,
    height: 400,
    borderWidth: 1,
    borderColor: 'orange',
  },
});

export default PanResponderComp;

Line.js

import React from 'react';
import {View, Text, StyleSheet} from 'react-native';
import Svg, {Line} from 'react-native-svg';

export default ({x, y}) => {
  // console.log(vertical);
  return (
    <Svg>
      <Line
        x1={'0'}
        x2={x}
        y1={'0'}
        y2={y}
        stroke={'black'}
        strokeWidth={'2'}
        strokeDasharray="6 6"
      />
    </Svg>
  );
};

PanResponder デモ

4

1 に答える 1