1.ReactNative-Animatedå¨ç»å°ç»
2.UI进阶第十发:Quartz2D手势识别
ReactNative-Animatedå¨ç»å°ç»
åè¨
ReactNativeä¸å ±æä¾äºä¸¤ç§å¨ç»ï¼ä¸ç§æ¯å¯ä»¥ç»å¶èªå®ä¹å¨ç»çAnimatedåºï¼å¦ä¸ç§æ¯è´è´£å¸å±å¨ç»çLayoutAnimationãAnimatedæ¨å¨ä»¥å£°æçå½¢å¼æ¥å®ä¹å¨ç»ï¼ä»å¤©ä¸»è¦ä»ç»Animatedã
å建å¨ç»å®ç½ç»åºçå建å¨ç»çæ¥éª¤ï¼
The手势手势coreworkflowforcreatingananimationistocreateanAnimated.Value,hookituptooneormorestyleattributesofananimatedcomponent,andthendriveupdatesviaanimationsusingAnimated.timing().
å°ä¸é¢çé¿å¥ç¿»è¯å¹¶æå¼åï¼æ们ç¥éï¼å建ä¸ä¸ªAnimatedå¨ç»åä¸æ¥ï¼
å建ä¸ä¸ªAnimated.Valueã
å°å建çAnimated.Valueè¿æ¥å°å¨ç»ç»ä»¶çä¸ä¸ªæå¤ä¸ªå±æ§ã
使ç¨Animated.timingçæ¹æ³æ´æ¹Animated.Valueã
æ¥ä¸æ¥æ们ççè¿ä¸å¥è¯éæå°çä¸äºåè¯é½æ¯ä»ä¹ã
Animated.ValueAnimatedæä¾äºä¸¤ç§ç±»åçå¼ï¼
Animated.Value()ç¨äºå个å¼ã
å°æå·§ï¼å¯ä»¥ä½¿ç¨Animated.Value().interpolate()æ¹æ³æ¥åå¼çæ å°ï¼ä»è让Animated.Value()?对åºå¤ä¸ªå¼ã
Animated.ValueXY()ç¨äºç¢éå¼ã
使ç¨Animated.Valueæç»è¦çä¸ç¹æ¯ï¼ä¸è¦ç´æ¥ä¿®æ¹å¨ç»å¼ï¼ï¼è¦ä½¿ç¨Animatedæä¾çæ¹æ³æ¥ä¿®æ¹å¨ç»å¼ï¼å¦setValue()æ¹æ³çãè¿ä¹å°±æå³çï¼å¨å½æ°ç»ä»¶ä¸ä½¿ç¨stateæ¥ä¿åå¨ç»å¼çè¯ï¼setStateæ¯æ°¸è¿é½ä¸ä¼è¢«ç¨å°çãæ以建议å¨å½æ°å¼ç»ä»¶ä¸ä½¿ç¨useRefä¿åå¨ç»å¼ï¼å¨ç±»ç»ä»¶ä¸ä½¿ç¨stateæ¥ä¿åå¨ç»å¼ã
constopacity=useRef(newAnimated.Value(initialValue)).current;å¨ç»ç»ä»¶å¸¸è§çç»ä»¶å¿ é¡»ç»è¿å¤çæè½ç¨äºå¨ç»ï¼æè°çç¹æ®å¤ç主è¦æ¯ææå¨ç»å¼ç»å®å¨å±æ§ä¸ï¼å¹¶ä¸å¨ä¸å¸§å¸§æ§è¡å¨ç»æ¶é¿å reactéæ°æ¸²æåéæ°è°åçå¼éãæ¤å¤è¿å¾å¨ç»ä»¶å¸è½½æ¶åä¸äºæ¸ çå·¥ä½ï¼ä½¿å¾è¿äºç»ä»¶å¨ä½¿ç¨æ¶æ¯å®å ¨çã
Animatedæä¾äºå¤çç»ä»¶çæ¹æ³ï¼Animated.createAnimatedComponent()ï¼è¯¥æ¹æ³æ¥åä¸ä¸ªå符串ââç»ä»¶çå称ï¼å¹¶è¿åä¸ä¸ªå¨ç»ç»ä»¶ï¼
constAnimatedButton=Animated.createAnimatedComponent('MyButton');æ¤æ¶å°±å¯ä»¥ä½¿ç¨AnimatedButtonæ¥è¿è¡å¨ç»å±æ§çç»å®æä½äºã
å¦å¤ï¼å¯¹äºä¸äºå¸¸ç¨çç»ä»¶ï¼Animatedé»è®¤æä¾å®ä»¬å¯¹åºçå¨ç»ç»ä»¶ï¼
Animated.Image
Animated.ScrollView
Animated.Text
Animated.View
Animated.FlatList
Animated.SectionList
å½ç¶ï¼è¿äºé»è®¤æä¾çç»ä»¶ä¹é½æ¯ç¨createAnimatedComponentè¿ä¸ªæ¹æ³å°è£ å¾æ¥çã
å¨ç»ç±»åAnimatedæä¾äºä¸ç§å¨ç»ç±»åï¼
Animated.decay()以æå®çåå§é度å¼å§ååï¼ç¶åååé度è¶æ¥è¶æ ¢ç´è³åä¸ã
Animated.spring()æä¾äºä¸ä¸ªåºç¡ç弹簧ç©ç模å.
Animated.timing()使ç¨easingå½æ°è®©æ°å¼éæ¶é´å¨èµ·æ¥ã
å ¶ä¸æ常ç¨çæ¯timing()
statictiming(value,config);configæ以ä¸åæ°ï¼
duration:å¨ç»çæç»æ¶é´ï¼æ¯«ç§ï¼ï¼é»è®¤å¼ä¸ºã
easing:ç¼å¨å½æ°ãé»è®¤ä¸ºEasing.inOut(Easing.ease)ã
delay:å¼å§å¨ç»åç延è¿æ¶é´ï¼æ¯«ç§ï¼ï¼é»è®¤ä¸º0ã
isInteraction:æå®æ¬å¨ç»æ¯å¦å¨InteractionManagerçéåä¸æ³¨åï¼èInteractionmanagerå¯ä»¥å°ä¸äºèæ¶è¾é¿çå·¥ä½å®æå°ææäºå¨æå¨ç»å®æä¹ååè¿è¡ï¼è¿æ ·å¯ä»¥ä¿è¯JavaScriptå¨ç»çæµç è¿è¡ï¼é»è®¤å¼ä¸ºtrueã
useNativeDriver:å¯ç¨åçå¨ç»é©±å¨ãé»è®¤ä¸å¯ç¨(false)ã
è¿éçuseNativeDriverçå ·ä½ä½ç¨å使ç¨æå·§å°å¨ä¸ä¸ç¯è®²è§£ã
ç»å¶è¿åº¦æ¡å æ¥ç»ä¸ä¸ªç®åçè¿åº¦æ¡ï¼ææ为ï¼è¿å ¥é¡µé¢åï¼è¿åº¦æ¡åé¿çåæ¶ï¼é¢è²ä¹ç±ç»¿è²æ¸å为红è²ã
åç代ç ï¼
constApp=()=>{ //使ç¨refæ¥ä¿åAnimated.Valueå¨ç»å¼constwidthX=useRef(newAnimated.Value(0)).current;useEffect(()=>{ //表示è¿å ¥é¡µé¢åä¸ç§éæ¶é´å widthXåéä»0ååå°ï¼è®°ä½æåä¸å®è¦æstart()æ¥å¯å¨å¨ç»ãAnimated.timing(widthX,{ toValue:,duration:,useNativeDriver:false,}).start();},[]);return(<Viewstyle={ styles.container}><Animated.Viewstyle={ { height:,width:widthX,//è¿éç¨å°äºinterpolateæ¹æ³æ¥è¿è¡æå¼è®¡ç®ï¼ä¸ä¸ªå¨ç»å¼å¯¹åºäºä¸¤ä¸ªå±æ§backgroundColor:widthX.interpolate({ inputRange:[0,],outputRange:['green','red'],}),}}></Animated.View></View>);};conststyles=StyleSheet.create({ container:{ backgroundColor:'#ffffff',flex:1,justifyContent:'center',},});ä¸é¢ç代ç ä¸ï¼æ们使ç¨å°äºä¸ä¸ªå¨åå¨ç»æ¶ç»å¸¸ä¼ç¨å°çä¸ä¸ªæ¹æ³interpolateï¼è¿ä¸ªæ¹æ³å¯ä»¥å¯¹å¨ç»å¼åä¸ä¸ªæ å°ï¼è¿æ ·æ们å¯ä»¥ç¨ä¸ä¸ªå¨ç»å¼æ¥ç»å®å¤ä¸ªå±æ§ã
å¤æå¨ç»ææ³ä¸é¢çå¨ç»æ¯è¾ç®åï¼å¨å®é å¼åè¿ç¨ä¸ï¼æ们ç»å¸¸ä¼ç¢°å°æ¯è¾å¤æçå¨ç»ææãè¿æ¶åä¸è¦æ ï¼å¤æå¨ç»æ éå°±æ¯ç®åå¨ç»çç»åï¼ä¸å¿ææ³å°±æ¯å¯¹å¨ç»è¿è¡âå解âãå¤æå¨ç»æ éå°±æ¯å¯¹å¹³ç§»ï¼æ¸åï¼æ转çç®åå¨ç»çç»åå°è£ ã
æ¯å¦æ³è¦å®ç°ä¸å¾ç红å æµ®å¨çææï¼å¯ä»¥å°å¨ç»æ解为ä¸é´çå¡çåå°çåæ¶ï¼ä¸¤è¾¹çå¡çå大ï¼ä¸é´çå¡çå大çåæ¶ï¼ä¸¤è¾¹çå¡çåå°ï¼ä½ä¸å¼ å¡ççé´è·å§ç»ä¸åãè¿æ ·æµ®å¨ææå°±å®ç°åºæ¥äºã
æå¿å¨ç»ä¸é¢çä»ç»çå¨ç»é½æ¯ä½¿ç¨timing()æ¹æ³ï¼è¦ä¹å¨è¿å ¥é¡µé¢åï¼è¦ä¹å¨è§¦åäºæ个äºä»¶åï¼å¨ç»å¼å§å¯å¨ãå®é å¼åä¸ï¼æ们ç»å¸¸è¿ä¼éå°å¦å¤ä¸ç§å¨ç»ï¼è·æå¿ç¸å ³çå¨ç»ã
è¿éæ们举ä¸ä¸ªå¤´é¨æ¸åææçä¾åï¼å¤§é¨åAppé½æ导èªæ æ¸åææï¼å³éç页é¢ä¸æ»ï¼å¤´é¨ç导èªæ ç¼æ ¢æµ®ç°ã
è¿éåªéè¦ä¸è¡æ ¸å¿ä»£ç å³å¯å®ç°ï¼
//1.声æå¨ç»å¼ä¿å页é¢å·²æ»å¨çé¿åº¦constscrollY=useRef(newAnimated.Value(0)).current;//2.使ç¨Animated.eventæ¹æ³å°event.nativeEvent.contentOffset.yçå¼å³Yè½´ç移å¨è·ç¦»æ å°å°äºscrollYä¸ã<ScrollViewonScroll={ Animated.event([{ nativeEvent:{ contentOffset:{ y:scrollY}}}])}></ScrollView>//3.å°scrollYéè¿interpolateæ¹æ³æ å°å°éæ度ä¸ï¼å½é¡µé¢æ»å¨è·ç¦»ä¸º0->æ¶ï¼ç¶ææ çä¸éæ度ä¹ä¼ç¸åºå°ä»0->1ã<Viewstyle={ { opacity:scrollY.interpolate({ inputRange:[0,],outputRange:[0,1]})}}></View>è¿éç¨å°äºAnimated.event()æ¹æ³ï¼è¿ä¸ªæ¹æ³ä¸è¬ä¼ç»åScrollViewç»ä»¶çonScrollå±æ§æè PanResponderç±»éé¢çæ¹æ³ä½¿ç¨ã
æ»ç»è¿ç¯æç« ä¸»è¦æ¯å¸¦å¤§å®¶å ¥é¨ReactNativeèªå¸¦çAnimatedå¨ç»åºï¼å¦ä¹ åäºè§£äºç®åå¨ç»çç»æ³ä»¥åå¤æå¨ç»çææ³ãä¸è¿å¤§å¤æ°æ¶åï¼æ们ä¼åç°å¨ç»ç»å¸¸ä¼æå¡é¡¿çé®é¢ï¼ä¸ä¸ç¯æç« ï¼æ们主è¦æ¢è®¨å¦ä½è§£å³å¨ç»å¡é¡¿çé®é¢ï¼ä»¥åä¸äºå¤çæå·§ã
åæï¼/post/UI进阶第十发:Quartz2D手势识别
在UI开发中,手势识别是动画动画实现互动和自然操作的关键技术。Quartz2D为iOS和Mac开发人员提供了强大的源码源码绘图和动画工具,同时也包含了手势识别功能。下载以下将详细探讨Quartz2D手势识别的手势手势拔河游戏源码实现。
在开始之前,动画动画网站源码dede我们需要了解手势识别的源码源码几种基本状态。手势识别的下载状态是通过`UIGestureRecognizerState`枚举定义的,该枚举包括但不限于以下几种状态:
- `UIGestureRecognizerStatePossible`:这是手势手势手势识别的默认状态,表示没有触摸事件发生。动画动画
- `UIGestureRecognizerStateBegan`:表示一个手势已经开始但尚未改变或完成。源码源码
- `UIGestureRecognizerStateChanged`:表示手势状态发生了改变。下载
- `UIGestureRecognizerStateEnded`:表示手势完成。手势手势南极ssc源码
- `UIGestureRecognizerStateCancelled`:表示手势取消,动画动画恢复至`Possible`状态。源码源码
- `UIGestureRecognizerStateFailed`:表示手势失败,恢复至`Possible`状态。如意棋牌源码
- `UIGestureRecognizerStateRecognized`:表示识别到手势操作,实质上等同于`UIGestureRecognizerStateEnded`。
在Quartz2D中,手势识别通常通过为视图或图层添加手势识别器(`UIGestureRecognizer`)来实现。劫持流量源码例如,以下代码片段展示了为视图`self`添加了一个`UITapGestureRecognizer`,用于响应用户的点击操作:
[tap addTarget:self action:@selector(tapIconView:)];
在代码中,`tap`是视图上的一个手势识别器,`@selector(tapIconView:)`指定了当手势识别器被触发时调用的方法名称。`tapIconView:`方法负责处理点击事件,可能包括对视图的某些动作或功能的执行。
总结而言,Quartz2D手势识别通过定义手势的状态和添加手势识别器至视图,为开发者提供了实现丰富互动和自然操作的强大工具。掌握这些基本概念和实现方式,将有助于开发出更加流畅和用户友好的界面。