React native 如何设置根据内容类型更改的模态高度的动画?

React native 如何设置根据内容类型更改的模态高度的动画?,react-native,animation,React Native,Animation,我有一个基于状态字符串改变高度的模式。不同的高度可以工作,但我正在尝试找出如何在高度过渡之间平滑地设置动画。现在,我有一个平滑的过渡,从模态打开到最终高度,然后关闭,但是当模态在完全关闭之前改变高度时,没有平滑的动画可以向下滑动 例如: 当我点击一个按钮时,我的模态动画高度为70。 一旦我从模型内部单击一个按钮,我的模型将平滑地动画到60的高度。 一旦我再次从我的模态内部点击一个按钮,我的模态应该平滑地动画到40的高度 当我第一次打开它和完全关闭它时,模态有一个平滑的上下滑动动画,但上面提到的中

我有一个基于状态字符串改变高度的模式。不同的高度可以工作,但我正在尝试找出如何在高度过渡之间平滑地设置动画。现在,我有一个平滑的过渡,从模态打开到最终高度,然后关闭,但是当模态在完全关闭之前改变高度时,没有平滑的动画可以向下滑动

例如: 当我点击一个按钮时,我的模态动画高度为70。 一旦我从模型内部单击一个按钮,我的模型将平滑地动画到60的高度。 一旦我再次从我的模态内部点击一个按钮,我的模态应该平滑地动画到40的高度

当我第一次打开它和完全关闭它时,模态有一个平滑的上下滑动动画,但上面提到的中间步骤没有

export interface Props {
  expanded?: boolean;
  maxHeightPercentage?: number;
  onClose?: () => void;
  onOpen?: () => void;
  onOpened?: () => void;
  onClosed?: () => void;
}
export const Overlay: React.FC<Props> = ({
  expanded = false,
  onClose,
  onOpen,
  onClosed,
  onOpened,
  maxHeightPercentage = 67,
  children,
}) => {
  const [expandedInternal, setExpandedInternal] = useState(false);
  const previousExpandedInternal = usePrevious(expandedInternal);
  useEffect(() => {
    if (expanded !== expandedInternal) {
      setExpandedInternal(expanded);
    }
  }, [expanded, expandedInternal]);
  const theme = useContext(ThemeContext);
  const overlayHeight = useRef(new Animated.Value(0));
  useEffect(() => {
    if (expandedInternal !== previousExpandedInternal) {
      expandedInternal ? onOpen?.() : onClose?.();
      const callback = expandedInternal ? onOpened : onClosed;
      const toValue = expandedInternal ? 1 : 0;
      Animated.timing(overlayHeight.current, {
        toValue,
        duration: 500,
        easing: Easing.linear,
        useNativeDriver: false,
      }).start(callback);
    }
  }, [expandedInternal, onClose, onOpen, onOpened, onClosed, previousExpandedInternal]);
  return (
    <Animated.View
      style={
        {
          height: overlayHeight.current.interpolate({
            inputRange: [0, 1],
            outputRange: ["0%", `${maxHeightPercentage}%`],
          }),
        },
      }>
      {children}
    </Animated.View>
  );
};
导出接口道具{
扩展?:布尔;
最大高度百分比?:数字;
onClose?:()=>无效;
onOpen?:()=>无效;
OnOpen?:()=>无效;
一旦关闭?:()=>无效;
}
导出常量覆盖:React.FC=({
扩展=假,
一旦失去,
奥诺彭,
一旦关闭,
开放的,
最大高度百分比=67,
儿童
}) => {
const[expandedInternal,setExpandedInternal]=useState(false);
const previousExpandedInternal=使用Previous(expandedInternal);
useffect(()=>{
如果(已展开!==已展开内部){
设置内部扩展(扩展);
}
},[扩展,内部扩展];
const theme=useContext(ThemeContext);
const overlayHeight=useRef(新的动画.Value(0));
useffect(()=>{
if(expandedInternal!==以前的expandedInternal){
扩展内部?onOpen?():onClose?();
const callback=expandedInternal?onOpened:onClosed;
常数toValue=expandedenternal?1:0;
动画。计时(overlayHeight.current{
toValue,
持续时间:500,
放松:放松,线性,
useNativeDriver:错误,
}).启动(回调);
}
},[ExpandedEnternal,onClose,onOpen,onOpened,onClosed,PreviousExpandedEnternal];
返回(
{儿童}
);
};

你熟悉API吗?@Kai我没怎么用过,但我听说过!我来看看医生,谢谢。你知道我在哪里可以看到一个简单的例子,这个布局动画的模式会改变高度吗?另外,我听说一般来说,动画API比布局动画API更受欢迎,但不确定这是否准确。。