feat:iOS Affects Transformation
This commit is contained in:
		| @@ -16,4 +16,5 @@ export default [ | |||||||
|     'src/FlowLayoutDemo', |     'src/FlowLayoutDemo', | ||||||
|     'src/PopoverDemo', |     'src/PopoverDemo', | ||||||
|     'src/AnimatorDemo', |     'src/AnimatorDemo', | ||||||
|  |     'src/ComplicatedAnimations', | ||||||
| ] | ] | ||||||
| @@ -167,40 +167,6 @@ class AnimatorDemo extends Panel { | |||||||
|                                 }); |                                 }); | ||||||
|                             } |                             } | ||||||
|                         }), |                         }), | ||||||
|                         thisLabel('animationSet').apply({ |  | ||||||
|                             onClick: () => { |  | ||||||
|                                 const animationSet = new AnimationSet |  | ||||||
|                                 //animationSet.fillMode = FillMode.Removed |  | ||||||
|                                 const translate = new TranslationAnimation |  | ||||||
|                                 translate.fromTranslationX = 100 |  | ||||||
|                                 translate.toTranslationX = 200 |  | ||||||
|                                 translate.fromTranslationY = 10 |  | ||||||
|                                 translate.toTranslationY = 200 |  | ||||||
|                                 translate.duration = 2000 |  | ||||||
|                                 translate.delay = 1000 |  | ||||||
|                                 translate.fillMode = FillMode.Forward |  | ||||||
|                                 const scale = new ScaleAnimation |  | ||||||
|                                 scale.fromScaleX = 1 |  | ||||||
|                                 scale.toScaleX = 5 |  | ||||||
|                                 scale.fromScaleY = 1 |  | ||||||
|                                 scale.toScaleY = 5 |  | ||||||
|                                 //scale.delay = 1000 |  | ||||||
|                                 scale.duration = 2000 |  | ||||||
|                                 scale.fillMode = FillMode.Backward |  | ||||||
|                                 const rotation = new RotationAnimation |  | ||||||
|                                 rotation.fromRotation = 0 |  | ||||||
|                                 rotation.toRotation = 6.3 |  | ||||||
|                                 rotation.duration = 2000 |  | ||||||
|                                 rotation.fillMode = FillMode.Removed |  | ||||||
|                                 animationSet.addAnimation(translate) |  | ||||||
|                                 animationSet.addAnimation(scale) |  | ||||||
|                                 animationSet.addAnimation(rotation) |  | ||||||
|  |  | ||||||
|                                 view.doAnimation(context, animationSet).then(() => { |  | ||||||
|                                     modal(context).toast('Animation finished') |  | ||||||
|                                 }) |  | ||||||
|                             } |  | ||||||
|                         }), |  | ||||||
|                     ]).apply({ space: 10 } as IHLayout), |                     ]).apply({ space: 10 } as IHLayout), | ||||||
|                 ] |                 ] | ||||||
|             ).apply({ space: 10 } as IVLayout), |             ).apply({ space: 10 } as IVLayout), | ||||||
|   | |||||||
							
								
								
									
										110
									
								
								demo/src/ComplicatedAnimations.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								demo/src/ComplicatedAnimations.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,110 @@ | |||||||
|  | import { animate, Group, Panel, gravity, Color, AnimationSet, vlayout, scroller, layoutConfig, IVLayout, modal, IText, network, View, stack, IHLayout, hlayout, IView, text, TranslationAnimation, ScaleAnimation, RotationAnimation, FillMode } from "doric"; | ||||||
|  | import { title, colors, box } from "./utils"; | ||||||
|  |  | ||||||
|  | function thisLabel(str: string) { | ||||||
|  |     return text({ | ||||||
|  |         text: str, | ||||||
|  |         width: 80, | ||||||
|  |         height: 30, | ||||||
|  |         bgColor: colors[0], | ||||||
|  |         textSize: 10, | ||||||
|  |         textColor: Color.WHITE, | ||||||
|  |         layoutConfig: layoutConfig().exactly(), | ||||||
|  |     }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @Entry | ||||||
|  | class AnimationDemo extends Panel { | ||||||
|  |     build(rootView: Group): void { | ||||||
|  |         const view = box(2) | ||||||
|  |         view.onClick = () => { | ||||||
|  |             modal(context).toast('Clicked') | ||||||
|  |         } | ||||||
|  |         vlayout([ | ||||||
|  |             title("Complicated Animation"), | ||||||
|  |             vlayout( | ||||||
|  |                 [ | ||||||
|  |                     hlayout([ | ||||||
|  |                         thisLabel('TranslationX').apply({ | ||||||
|  |                             onClick: () => { | ||||||
|  |                                 const animation = new TranslationAnimation | ||||||
|  |                                 animation.duration = 1000 | ||||||
|  |                                 animation.fromTranslationX = view.translationX || 0 | ||||||
|  |                                 animation.toTranslationX = animation.fromTranslationX + 100 | ||||||
|  |                                 animation.fromTranslationY = view.translationY || 0 | ||||||
|  |                                 animation.toTranslationY = view.translationY || 0 | ||||||
|  |                                 view.doAnimation(context, animation) | ||||||
|  |                             } | ||||||
|  |                         }), | ||||||
|  |                         thisLabel('TranslationY').apply({ | ||||||
|  |                             onClick: () => { | ||||||
|  |                                 const animation = new TranslationAnimation | ||||||
|  |                                 animation.duration = 1000 | ||||||
|  |                                 animation.fromTranslationX = view.translationX || 0 | ||||||
|  |                                 animation.toTranslationX = view.translationX || 0 | ||||||
|  |                                 animation.fromTranslationY = view.translationY || 0 | ||||||
|  |                                 animation.toTranslationY = animation.fromTranslationY + 100 | ||||||
|  |                                 view.doAnimation(context, animation) | ||||||
|  |                             } | ||||||
|  |                         }), | ||||||
|  |                         thisLabel('ScaleX').apply({ | ||||||
|  |                             onClick: () => { | ||||||
|  |                                 const animation = new ScaleAnimation | ||||||
|  |                                 animation.duration = 1000 | ||||||
|  |                                 animation.fromScaleX = 0 | ||||||
|  |                                 animation.toScaleX = 5 | ||||||
|  |                                 view.doAnimation(context, animation) | ||||||
|  |                             } | ||||||
|  |                         }), | ||||||
|  |                         thisLabel('ScaleY').apply({ | ||||||
|  |                             onClick: () => { | ||||||
|  |                                 const animation = new ScaleAnimation | ||||||
|  |                                 animation.duration = 1000 | ||||||
|  |                                 animation.fromScaleY = 0 | ||||||
|  |                                 animation.toScaleY = 5 | ||||||
|  |                                 view.doAnimation(context, animation) | ||||||
|  |                             } | ||||||
|  |                         }), | ||||||
|  |                         thisLabel('rotation').apply({ | ||||||
|  |                             onClick: () => { | ||||||
|  |                                 const animation = new RotationAnimation | ||||||
|  |                                 animation.duration = 1000 | ||||||
|  |                                 animation.fromRotation = 0 | ||||||
|  |                                 animation.toRotation = 4 | ||||||
|  |                                 view.doAnimation(context, animation) | ||||||
|  |                             } | ||||||
|  |                         }), | ||||||
|  |                     ]).apply({ space: 10 } as IHLayout), | ||||||
|  |                     hlayout([ | ||||||
|  |                         thisLabel('group').apply({ | ||||||
|  |                             onClick: () => { | ||||||
|  |                                 const rotation = new RotationAnimation | ||||||
|  |                                 rotation.duration = 1000 | ||||||
|  |                                 rotation.fromRotation = 0 | ||||||
|  |                                 rotation.toRotation = 4 | ||||||
|  |                                 const translation = new TranslationAnimation | ||||||
|  |                                 translation.duration = 1000 | ||||||
|  |                                 translation.fromTranslationX = view.translationX || 0 | ||||||
|  |                                 translation.toTranslationX = 100 | ||||||
|  |                                 const animationSet = new AnimationSet | ||||||
|  |                                 animationSet.addAnimation(rotation) | ||||||
|  |                                 animationSet.addAnimation(translation) | ||||||
|  |                                 view.doAnimation(context, animationSet) | ||||||
|  |                             } | ||||||
|  |                         }), | ||||||
|  |                     ]).apply({ space: 10 } as IHLayout), | ||||||
|  |                 ] | ||||||
|  |             ).apply({ space: 10 } as IVLayout), | ||||||
|  |             stack([ | ||||||
|  |                 view, | ||||||
|  |             ]).apply({ | ||||||
|  |                 layoutConfig: layoutConfig().atmost(), | ||||||
|  |                 bgColor: colors[1].alpha(0.3 * 255), | ||||||
|  |             }), | ||||||
|  |         ]).apply({ | ||||||
|  |             layoutConfig: layoutConfig().atmost(), | ||||||
|  |             gravity: gravity().center(), | ||||||
|  |             space: 10, | ||||||
|  |         } as IVLayout).in(rootView) | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -67,13 +67,29 @@ CGPathRef DoricCreateRoundedRectPath(CGRect bounds, | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @interface AnimationCallback : NSObject <CAAnimationDelegate> | @interface AnimationCallback : NSObject <CAAnimationDelegate> | ||||||
| @property(nonatomic, strong) void (^endBlock)(); | @property(nonatomic, strong) NSMutableDictionary *dictionary; | ||||||
|  | @property(nonatomic, strong) void (^startBlock)(AnimationCallback *callback); | ||||||
|  | 
 | ||||||
|  | @property(nonatomic, strong) void (^endBlock)(AnimationCallback *callback); | ||||||
| @end | @end | ||||||
| 
 | 
 | ||||||
| @implementation AnimationCallback | @implementation AnimationCallback | ||||||
|  | - (instancetype)init { | ||||||
|  |     if (self = [super init]) { | ||||||
|  |         _dictionary = [NSMutableDictionary new]; | ||||||
|  |     } | ||||||
|  |     return self; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | - (void)animationDidStart:(CAAnimation *)anim { | ||||||
|  |     if (self.startBlock) { | ||||||
|  |         self.startBlock(self); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { | - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { | ||||||
|     if (self.endBlock) { |     if (self.endBlock) { | ||||||
|         self.endBlock(); |         self.endBlock(self); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @end | @end | ||||||
| @@ -321,11 +337,42 @@ - (void)blendLayoutConfig:(NSDictionary *)params { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | - (NSDictionary *)transformation { | ||||||
|  |     NSMutableDictionary *dictionary = [NSMutableDictionary new]; | ||||||
|  |     if (self.translationX) { | ||||||
|  |         dictionary[@"translationX"] = self.translationX; | ||||||
|  |     } | ||||||
|  |     if (self.translationY) { | ||||||
|  |         dictionary[@"translationY"] = self.translationY; | ||||||
|  |     } | ||||||
|  |     if (self.scaleX) { | ||||||
|  |         dictionary[@"scaleX"] = self.scaleX; | ||||||
|  |     } | ||||||
|  |     if (self.scaleY) { | ||||||
|  |         dictionary[@"scaleY"] = self.scaleY; | ||||||
|  |     } | ||||||
|  |     if (self.rotation) { | ||||||
|  |         dictionary[@"rotation"] = self.rotation; | ||||||
|  |     } | ||||||
|  |     return dictionary; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| - (void)doAnimation:(id)params withPromise:(DoricPromise *)promise { | - (void)doAnimation:(id)params withPromise:(DoricPromise *)promise { | ||||||
|     CAAnimation *animation = [self parseAnimation:params]; |     CAAnimation *animation = [self parseAnimation:params]; | ||||||
|  |     AnimationCallback *originDelegate = animation.delegate; | ||||||
|     AnimationCallback *animationCallback = [[AnimationCallback new] also:^(AnimationCallback *it) { |     AnimationCallback *animationCallback = [[AnimationCallback new] also:^(AnimationCallback *it) { | ||||||
|         it.endBlock = ^{ |         it.startBlock = ^(AnimationCallback *callback) { | ||||||
|             [promise resolve:nil]; |             if (originDelegate) { | ||||||
|  |                 originDelegate.startBlock(callback); | ||||||
|  |             } | ||||||
|  |             [self transformProperties]; | ||||||
|  |         }; | ||||||
|  |         it.endBlock = ^(AnimationCallback *callback) { | ||||||
|  |             if (originDelegate) { | ||||||
|  |                 originDelegate.endBlock(callback); | ||||||
|  |             } | ||||||
|  |             [self transformProperties]; | ||||||
|  |             [promise resolve:self.transformation]; | ||||||
|         }; |         }; | ||||||
|     }]; |     }]; | ||||||
|     animation.delegate = animationCallback; |     animation.delegate = animationCallback; | ||||||
| @@ -340,9 +387,7 @@ - (CFTimeInterval)computeDurationOfAnimations:(NSArray<CAAnimation *> *)animatio | |||||||
|     [animations forEach:^(CAAnimation *obj) { |     [animations forEach:^(CAAnimation *obj) { | ||||||
|         interval = MAX(interval, obj.beginTime + obj.duration * (1 + obj.repeatCount)); |         interval = MAX(interval, obj.beginTime + obj.duration * (1 + obj.repeatCount)); | ||||||
|     }]; |     }]; | ||||||
|     /// Here add 0.00001 to force animationGroup's last child animation affects fill mode. |     return interval; | ||||||
|     /// Otherwise the child's fill mode will be overwritten by parent. |  | ||||||
|     return interval + 0.00001; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| - (CAAnimation *)parseAnimation:(id)params { | - (CAAnimation *)parseAnimation:(id)params { | ||||||
| @@ -354,9 +399,27 @@ - (CAAnimation *)parseAnimation:(id)params { | |||||||
|             [animations addObject:[self parseAnimation:obj]]; |             [animations addObject:[self parseAnimation:obj]]; | ||||||
|         }]; |         }]; | ||||||
|         animationGroup.duration = [self computeDurationOfAnimations:animations]; |         animationGroup.duration = [self computeDurationOfAnimations:animations]; | ||||||
|         animationGroup.fillMode = [self translateToFillMode:params[@"fillMode"]]; |  | ||||||
|         animationGroup.removedOnCompletion = [animationGroup.fillMode isEqualToString:kCAFillModeRemoved]; |  | ||||||
|         animationGroup.animations = animations; |         animationGroup.animations = animations; | ||||||
|  |         animationGroup.delegate = [[AnimationCallback new] also:^(AnimationCallback *it) { | ||||||
|  |             it.startBlock = ^(AnimationCallback *callback) { | ||||||
|  |                 [[animations map:^id(CABasicAnimation *obj) { | ||||||
|  |                     return obj.delegate; | ||||||
|  |                 }] forEach:^(AnimationCallback *obj) { | ||||||
|  |                     if (obj.startBlock) { | ||||||
|  |                         obj.startBlock(obj); | ||||||
|  |                     } | ||||||
|  |                 }]; | ||||||
|  |             }; | ||||||
|  |             it.endBlock = ^(AnimationCallback *callback) { | ||||||
|  |                 [[animations map:^id(CABasicAnimation *obj) { | ||||||
|  |                     return obj.delegate; | ||||||
|  |                 }] forEach:^(AnimationCallback *obj) { | ||||||
|  |                     if (obj.endBlock) { | ||||||
|  |                         obj.endBlock(obj); | ||||||
|  |                     } | ||||||
|  |                 }]; | ||||||
|  |             }; | ||||||
|  |         }]; | ||||||
|         if (params[@"delay"]) { |         if (params[@"delay"]) { | ||||||
|             animationGroup.beginTime = [params[@"delay"] floatValue] / 1000; |             animationGroup.beginTime = [params[@"delay"] floatValue] / 1000; | ||||||
|         } |         } | ||||||
| @@ -371,12 +434,23 @@ - (CAAnimation *)parseAnimation:(id)params { | |||||||
|             [changeables forEach:^(NSDictionary *obj) { |             [changeables forEach:^(NSDictionary *obj) { | ||||||
|                 NSString *key = obj[@"key"]; |                 NSString *key = obj[@"key"]; | ||||||
|                 if ([@"translationX" isEqualToString:key]) { |                 if ([@"translationX" isEqualToString:key]) { | ||||||
|                     from.x += [obj[@"fromValue"] floatValue]; |                     from.x += [obj[@"fromValue"] floatValue] - self.translationX.floatValue; | ||||||
|                     to.x += [obj[@"toValue"] floatValue]; |                     to.x += [obj[@"toValue"] floatValue] - self.translationX.floatValue; | ||||||
|  |                     [self setFillMode:animation | ||||||
|  |                                   key:key | ||||||
|  |                            startValue:obj[@"fromValue"] | ||||||
|  |                              endValue:obj[@"toValue"] | ||||||
|  |                              fillMode:params[@"fillMode"]]; | ||||||
|                 } else if ([@"translationY" isEqualToString:key]) { |                 } else if ([@"translationY" isEqualToString:key]) { | ||||||
|                     from.y += [obj[@"fromValue"] floatValue]; |                     from.y += [obj[@"fromValue"] floatValue] - self.translationY.floatValue; | ||||||
|                     to.y += [obj[@"toValue"] floatValue]; |                     to.y += [obj[@"toValue"] floatValue] - self.translationY.floatValue; | ||||||
|  |                     [self setFillMode:animation | ||||||
|  |                                   key:key | ||||||
|  |                            startValue:obj[@"fromValue"] | ||||||
|  |                              endValue:obj[@"toValue"] | ||||||
|  |                              fillMode:params[@"fillMode"]]; | ||||||
|                 } |                 } | ||||||
|  | 
 | ||||||
|             }]; |             }]; | ||||||
|             animation.fromValue = [NSValue valueWithCGPoint:from]; |             animation.fromValue = [NSValue valueWithCGPoint:from]; | ||||||
|             animation.toValue = [NSValue valueWithCGPoint:to]; |             animation.toValue = [NSValue valueWithCGPoint:to]; | ||||||
| @@ -384,11 +458,33 @@ - (CAAnimation *)parseAnimation:(id)params { | |||||||
|             return animation; |             return animation; | ||||||
|         } else { |         } else { | ||||||
|             CAAnimationGroup *animationGroup = [CAAnimationGroup animation]; |             CAAnimationGroup *animationGroup = [CAAnimationGroup animation]; | ||||||
|             NSMutableArray *animations = [NSMutableArray new]; |             NSMutableArray <CABasicAnimation *> *animations = [NSMutableArray new]; | ||||||
|  | 
 | ||||||
|             [changeables forEach:^(NSDictionary *obj) { |             [changeables forEach:^(NSDictionary *obj) { | ||||||
|                 [animations addObject:[self parseChangeable:obj]]; |                 CABasicAnimation *animation = [self parseChangeable:obj fillMode:params[@"fillMode"]]; | ||||||
|  |                 [animations addObject:animation]; | ||||||
|             }]; |             }]; | ||||||
|             animationGroup.animations = animations; |             animationGroup.animations = animations; | ||||||
|  |             animationGroup.delegate = [[AnimationCallback new] also:^(AnimationCallback *it) { | ||||||
|  |                 it.startBlock = ^(AnimationCallback *callback) { | ||||||
|  |                     [[animations map:^id(CABasicAnimation *obj) { | ||||||
|  |                         return obj.delegate; | ||||||
|  |                     }] forEach:^(AnimationCallback *obj) { | ||||||
|  |                         if (obj.startBlock) { | ||||||
|  |                             obj.startBlock(obj); | ||||||
|  |                         } | ||||||
|  |                     }]; | ||||||
|  |                 }; | ||||||
|  |                 it.endBlock = ^(AnimationCallback *callback) { | ||||||
|  |                     [[animations map:^id(CABasicAnimation *obj) { | ||||||
|  |                         return obj.delegate; | ||||||
|  |                     }] forEach:^(AnimationCallback *obj) { | ||||||
|  |                         if (obj.endBlock) { | ||||||
|  |                             obj.endBlock(obj); | ||||||
|  |                         } | ||||||
|  |                     }]; | ||||||
|  |                 }; | ||||||
|  |             }]; | ||||||
|             [self setAnimation:animationGroup params:params]; |             [self setAnimation:animationGroup params:params]; | ||||||
|             return animationGroup; |             return animationGroup; | ||||||
|         } |         } | ||||||
| @@ -413,11 +509,73 @@ - (void)setAnimation:(CAAnimation *)animation params:(NSDictionary *)params { | |||||||
|         animation.beginTime = [params[@"delay"] floatValue] / 1000; |         animation.beginTime = [params[@"delay"] floatValue] / 1000; | ||||||
|     } |     } | ||||||
|     animation.duration = [params[@"duration"] floatValue] / 1000; |     animation.duration = [params[@"duration"] floatValue] / 1000; | ||||||
|     animation.fillMode = [self translateToFillMode:params[@"fillMode"]]; |  | ||||||
|     animation.removedOnCompletion = [animation.fillMode isEqualToString:kCAFillModeRemoved]; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| - (CAAnimation *)parseChangeable:(NSDictionary *)params { | - (void)setFillMode:(CAAnimation *)animation | ||||||
|  |                 key:(NSString *)key | ||||||
|  |          startValue:(NSNumber *)startValue | ||||||
|  |            endValue:(NSNumber *)endValue | ||||||
|  |            fillMode:(NSNumber *)fillMode { | ||||||
|  |     NSUInteger fillModeInt = fillMode.unsignedIntegerValue; | ||||||
|  |     if ((fillModeInt & 2) == 2) { | ||||||
|  |         [self setAnimatedValue:key value:startValue]; | ||||||
|  |     } | ||||||
|  |     AnimationCallback *callback = [AnimationCallback new]; | ||||||
|  |     AnimationCallback *originCallback = animation.delegate; | ||||||
|  |     __weak typeof(self) _self = self; | ||||||
|  |     callback.startBlock = ^(AnimationCallback *callback) { | ||||||
|  |         __strong typeof(_self) self = _self; | ||||||
|  |         callback.dictionary[key] = [self getAnimatedValue:key]; | ||||||
|  |         if (originCallback) { | ||||||
|  |             originCallback.startBlock(callback); | ||||||
|  |         } | ||||||
|  |     }; | ||||||
|  |     callback.endBlock = ^(AnimationCallback *callback) { | ||||||
|  |         __strong typeof(_self) self = _self; | ||||||
|  |         if ((fillModeInt & 1) == 1) { | ||||||
|  |             [self setAnimatedValue:key value:endValue]; | ||||||
|  |         } | ||||||
|  |         if (originCallback) { | ||||||
|  |             originCallback.endBlock(callback); | ||||||
|  |         } | ||||||
|  |     }; | ||||||
|  |     animation.delegate = callback; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | - (NSNumber *)getAnimatedValue:(NSString *)key { | ||||||
|  |     if ([@"translationX" isEqualToString:key]) { | ||||||
|  |         return self.translationX; | ||||||
|  |     } | ||||||
|  |     if ([@"translationY" isEqualToString:key]) { | ||||||
|  |         return self.translationY; | ||||||
|  |     } | ||||||
|  |     if ([@"scaleX" isEqualToString:key]) { | ||||||
|  |         return self.scaleX; | ||||||
|  |     } | ||||||
|  |     if ([@"scaleY" isEqualToString:key]) { | ||||||
|  |         return self.scaleY; | ||||||
|  |     } | ||||||
|  |     if ([@"rotation" isEqualToString:key]) { | ||||||
|  |         return self.rotation; | ||||||
|  |     } | ||||||
|  |     return nil; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | - (void)setAnimatedValue:(NSString *)key value:(NSNumber *)value { | ||||||
|  |     if ([@"translationX" isEqualToString:key]) { | ||||||
|  |         self.translationX = value; | ||||||
|  |     } else if ([@"translationY" isEqualToString:key]) { | ||||||
|  |         self.translationY = value; | ||||||
|  |     } else if ([@"scaleX" isEqualToString:key]) { | ||||||
|  |         self.scaleX = value; | ||||||
|  |     } else if ([@"scaleY" isEqualToString:key]) { | ||||||
|  |         self.scaleY = value; | ||||||
|  |     } else if ([@"rotation" isEqualToString:key]) { | ||||||
|  |         self.rotation = value; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | - (CABasicAnimation *)parseChangeable:(NSDictionary *)params fillMode:(NSNumber *)fillMode { | ||||||
|     NSString *key = params[@"key"]; |     NSString *key = params[@"key"]; | ||||||
|     CABasicAnimation *animation = [CABasicAnimation animation]; |     CABasicAnimation *animation = [CABasicAnimation animation]; | ||||||
|     if ([@"scaleX" isEqualToString:key]) { |     if ([@"scaleX" isEqualToString:key]) { | ||||||
| @@ -437,6 +595,11 @@ - (CAAnimation *)parseChangeable:(NSDictionary *)params { | |||||||
|         animation.fromValue = params[@"fromValue"]; |         animation.fromValue = params[@"fromValue"]; | ||||||
|         animation.toValue = params[@"toValue"]; |         animation.toValue = params[@"toValue"]; | ||||||
|     } |     } | ||||||
|  |     [self setFillMode:animation | ||||||
|  |                   key:key | ||||||
|  |            startValue:params[@"fromValue"] | ||||||
|  |              endValue:params[@"toValue"] | ||||||
|  |              fillMode:fillMode]; | ||||||
|     return animation; |     return animation; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|   | |||||||
| @@ -27,7 +27,6 @@ export enum RepeatMode { | |||||||
| export interface IAnimation extends Modeling { | export interface IAnimation extends Modeling { | ||||||
|     duration: number |     duration: number | ||||||
|     delay?: number |     delay?: number | ||||||
|     fillMode: FillMode |  | ||||||
| } | } | ||||||
|  |  | ||||||
| export interface Changeable { | export interface Changeable { | ||||||
| @@ -215,7 +214,6 @@ export class AnimationSet implements IAnimation { | |||||||
|     private animations: IAnimation[] = [] |     private animations: IAnimation[] = [] | ||||||
|     _duration = 0 |     _duration = 0 | ||||||
|     delay?: number |     delay?: number | ||||||
|     fillMode = FillMode.Removed |  | ||||||
|     addAnimation(anim: IAnimation) { |     addAnimation(anim: IAnimation) { | ||||||
|         this.animations.push(anim) |         this.animations.push(anim) | ||||||
|     } |     } | ||||||
| @@ -234,7 +232,6 @@ export class AnimationSet implements IAnimation { | |||||||
|             animations: this.animations.map(e => { |             animations: this.animations.map(e => { | ||||||
|                 return e.toModel() |                 return e.toModel() | ||||||
|             }) as Model, |             }) as Model, | ||||||
|             fillMode: this.fillMode, |  | ||||||
|             delay: this.delay, |             delay: this.delay, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -336,7 +336,12 @@ export abstract class View implements Modeling, IView { | |||||||
|     /**----------transform----------*/ |     /**----------transform----------*/ | ||||||
|  |  | ||||||
|     doAnimation(context: BridgeContext, animation: IAnimation) { |     doAnimation(context: BridgeContext, animation: IAnimation) { | ||||||
|         return this.nativeChannel(context, "doAnimation")(animation.toModel()) |         return this.nativeChannel(context, "doAnimation")(animation.toModel()).then((args) => { | ||||||
|  |             for (let key in args) { | ||||||
|  |                 Reflect.set(this, key, Reflect.get(args, key, args), this) | ||||||
|  |                 Reflect.deleteProperty(this.__dirty_props__, key) | ||||||
|  |             } | ||||||
|  |         }) | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user