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手势识别的手势手势如何查询android源码实现。
在开始之前,动画动画美拍解析源码我们需要了解手势识别的源码源码几种基本状态。手势识别的下载状态是通过`UIGestureRecognizerState`枚举定义的,该枚举包括但不限于以下几种状态:
- `UIGestureRecognizerStatePossible`:这是手势手势手势识别的默认状态,表示没有触摸事件发生。动画动画
- `UIGestureRecognizerStateBegan`:表示一个手势已经开始但尚未改变或完成。源码源码
- `UIGestureRecognizerStateChanged`:表示手势状态发生了改变。下载
- `UIGestureRecognizerStateEnded`:表示手势完成。手势手势视频app源码开发
- `UIGestureRecognizerStateCancelled`:表示手势取消,动画动画恢复至`Possible`状态。源码源码
- `UIGestureRecognizerStateFailed`:表示手势失败,恢复至`Possible`状态。android 源码编译脚本
- `UIGestureRecognizerStateRecognized`:表示识别到手势操作,实质上等同于`UIGestureRecognizerStateEnded`。
在Quartz2D中,手势识别通常通过为视图或图层添加手势识别器(`UIGestureRecognizer`)来实现。易语言显卡源码例如,以下代码片段展示了为视图`self`添加了一个`UITapGestureRecognizer`,用于响应用户的点击操作:
[tap addTarget:self action:@selector(tapIconView:)];
在代码中,`tap`是视图上的一个手势识别器,`@selector(tapIconView:)`指定了当手势识别器被触发时调用的方法名称。`tapIconView:`方法负责处理点击事件,可能包括对视图的某些动作或功能的执行。
总结而言,Quartz2D手势识别通过定义手势的状态和添加手势识别器至视图,为开发者提供了实现丰富互动和自然操作的强大工具。掌握这些基本概念和实现方式,将有助于开发出更加流畅和用户友好的界面。