react-native-reanimated系列(五)

react-native-reanimated系列(一)
react-native-reanimated系列(二)
react-native-reanimated系列(三)
react-native-reanimated系列(四)

事件

為了使APP對用戶體驗更自然,我們使用動畫來平滑用戶與APP用戶界面的交互。

處理手勢事件

const EventsExample = () => {
  const pressed = useSharedValue(false);
  const eventHandler = useAnimatedGestureHandler({
    onStart: (event, ctx) => {
      pressed.value = true;
    },
    onEnd: (event, ctx) => {
      pressed.value = false;
    },
  });
  const uas = useAnimatedStyle(() => {
    return {
      backgroundColor: pressed.value ? '#FEEF86' : '#001972',
      transform: [{ scale: withSpring(pressed.value ? 1.2 : 1) }],
    };
  });
  return (
    <TapGestureHandler onGestureEvent={eventHandler}>
      <Animated.View style={[styles.ball, uas]} />
    </TapGestureHandler>
  );
};
touch-final.gif

處理連續(xù)手勢

const EventsExample = () => {
  const startingPosition = 100;
  const x = useSharedValue(startingPosition);
  const y = useSharedValue(startingPosition);
  const pressed = useSharedValue(false);
  const eventHandler = useAnimatedGestureHandler({
    onStart: (event, ctx) => {
      pressed.value = true;
      ctx.startX = x.value;
      ctx.startY = y.value;
    },
    onActive: (event, ctx) => {
      x.value = ctx.startX + event.translationX;
      y.value = ctx.startY + event.translationY;
    },
    onEnd: (event, ctx) => {
      pressed.value = false;
      x.value = withSpring(startingPosition);
      y.value = withSpring(startingPosition);
    },
  });
  const uas = useAnimatedStyle(() => {
    return {
      backgroundColor: pressed.value ? '#FEEF86' : '#001972',
      transform: [{ translateX: x.value }, { translateY: y.value }],
    };
  });
  return (
    <PanGestureHandler onGestureEvent={eventHandler}>
      <Animated.View style={[styles.ball, uas]} />
    </PanGestureHandler>
  );
};

當啟動新手勢時,事件中攜帶的轉(zhuǎn)換值是相對于手勢的開始位置而言的。結(jié)果,我們不能直接將手勢轉(zhuǎn)換映射到屏幕上的視圖偏移。解決方案是設(shè)置一個可以保持視圖起始偏移量的臨時狀態(tài)。為此,我們可以使用提供給每個手勢處理程序worklets的上下文參數(shù)。上下文只是在所有回調(diào)之間共享的JavaScript對象。換句話說,所有定義為手勢處理程序回調(diào)的方法都將接收相同的上下文對象實例。


final.gif

遷移

  • interpolate重命名interplolateNode
    如果您使用的是類成員方法AnimatedValue.interpolate,則無需更改。
  • Easing重命名EasingNode

常見問題解決方案

TypeError: Cannot convert undefined value to object on someVariable._closure

清除metro緩存,確保安裝了babel插件

watchman watch-del-all
yarn start --reset-cache

undefined is not an object (evaluating '_toConsumableArray(Array(length)).map')

worklet不支持擴展運算符(...array),可以使用以下方法替代:

  • 拷貝數(shù)組array.slice()
  • [...Array(length)].map的慣用語法Array(length).fill().map()
  • 合并對象Object.assign()
  • 函數(shù)里傳遞參數(shù)func.apply()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友。感恩相遇!感恩不離不棄。 中午開了第一次的黨會,身份的轉(zhuǎn)變要...
    余生動聽閱讀 10,852評論 0 11
  • 彩排完,天已黑
    劉凱書法閱讀 4,475評論 1 3
  • 沒事就多看看書,因為腹有詩書氣自華,讀書萬卷始通神。沒事就多出去旅游,別因為沒錢而找借口,因為只要你省吃儉用,來...
    向陽之心閱讀 4,973評論 3 11
  • 表情是什么,我認為表情就是表現(xiàn)出來的情緒。表情可以傳達很多信息。高興了當然就笑了,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 129,655評論 2 7

友情鏈接更多精彩內(nèi)容