feat:AnimatinSet on iOS use AnimationGroup
This commit is contained in:
		| @@ -665,8 +665,20 @@ public abstract class ViewNode<T extends View> extends DoricContextHolder { | |||||||
|         } else if (value.isObject()) { |         } else if (value.isObject()) { | ||||||
|             JSArray changeables = value.asObject().getProperty("changeables").asArray(); |             JSArray changeables = value.asObject().getProperty("changeables").asArray(); | ||||||
|             AnimatorSet animatorSet = new AnimatorSet(); |             AnimatorSet animatorSet = new AnimatorSet(); | ||||||
|  |  | ||||||
|  |             JSValue repeatCount = value.asObject().getProperty("repeatCount"); | ||||||
|  |  | ||||||
|  |             JSValue repeatMode = value.asObject().getProperty("repeatMode"); | ||||||
|  |  | ||||||
|             for (int j = 0; j < changeables.size(); j++) { |             for (int j = 0; j < changeables.size(); j++) { | ||||||
|                 animatorSet.play(parseChangeable(changeables.get(j).asObject())); |                 ObjectAnimator animator = parseChangeable(changeables.get(j).asObject()); | ||||||
|  |                 if (repeatCount.isNumber()) { | ||||||
|  |                     animator.setRepeatCount(repeatCount.asNumber().toInt()); | ||||||
|  |                 } | ||||||
|  |                 if (repeatMode.isNumber()) { | ||||||
|  |                     animator.setRepeatMode(repeatMode.asNumber().toInt()); | ||||||
|  |                 } | ||||||
|  |                 animatorSet.play(animator); | ||||||
|             } |             } | ||||||
|             long duration = value.asObject().getProperty("duration").asNumber().toLong(); |             long duration = value.asObject().getProperty("duration").asNumber().toLong(); | ||||||
|             animatorSet.setDuration(duration); |             animatorSet.setDuration(duration); | ||||||
| @@ -674,27 +686,19 @@ public abstract class ViewNode<T extends View> extends DoricContextHolder { | |||||||
|             if (delayJS.isNumber()) { |             if (delayJS.isNumber()) { | ||||||
|                 animatorSet.setStartDelay(delayJS.asNumber().toLong()); |                 animatorSet.setStartDelay(delayJS.asNumber().toLong()); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             return animatorSet; |             return animatorSet; | ||||||
|         } else { |         } else { | ||||||
|             return null; |             return null; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private Animator parseChangeable(JSObject jsObject) { |     private ObjectAnimator parseChangeable(JSObject jsObject) { | ||||||
|         String key = jsObject.getProperty("key").asString().value(); |         String key = jsObject.getProperty("key").asString().value(); | ||||||
|         ObjectAnimator animator = ObjectAnimator.ofFloat(this, |         return ObjectAnimator.ofFloat(this, | ||||||
|                 key, |                 key, | ||||||
|                 jsObject.getProperty("fromValue").asNumber().toFloat(), |                 jsObject.getProperty("fromValue").asNumber().toFloat(), | ||||||
|                 jsObject.getProperty("toValue").asNumber().toFloat() |                 jsObject.getProperty("toValue").asNumber().toFloat() | ||||||
|         ); |         ); | ||||||
|         JSValue repeatCount = jsObject.getProperty("repeatCount"); |  | ||||||
|         if (repeatCount.isNumber()) { |  | ||||||
|             animator.setRepeatCount(repeatCount.asNumber().toInt() + 1); |  | ||||||
|         } |  | ||||||
|         JSValue repeatMode = jsObject.getProperty("repeatMode"); |  | ||||||
|         if (repeatMode.isNumber()) { |  | ||||||
|             animator.setRepeatMode(repeatMode.asNumber().toInt()); |  | ||||||
|         } |  | ||||||
|         return animator; |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -174,7 +174,7 @@ class AnimatorDemo extends Panel { | |||||||
|                                 translate.fromTranslationY = 10 |                                 translate.fromTranslationY = 10 | ||||||
|                                 translate.toTranslationY = 200 |                                 translate.toTranslationY = 200 | ||||||
|                                 translate.duration = 3000 |                                 translate.duration = 3000 | ||||||
|  |                                 translate.delay = 1000 | ||||||
|                                 const scale = new ScaleAnimation |                                 const scale = new ScaleAnimation | ||||||
|                                 scale.fromScaleX = 1 |                                 scale.fromScaleX = 1 | ||||||
|                                 scale.toScaleX = 5 |                                 scale.toScaleX = 5 | ||||||
| @@ -185,13 +185,16 @@ class AnimatorDemo extends Panel { | |||||||
|                                 const rotation = new RotationAnimation |                                 const rotation = new RotationAnimation | ||||||
|                                 rotation.fromRotation = 0 |                                 rotation.fromRotation = 0 | ||||||
|                                 rotation.toRotation = 6 |                                 rotation.toRotation = 6 | ||||||
|  |                                 rotation.delay = 1000 | ||||||
|                                 rotation.duration = 3000 |                                 rotation.duration = 3000 | ||||||
|  |  | ||||||
|                                 animationSet.addAnimation(translate) |                                 animationSet.addAnimation(translate) | ||||||
|                                 animationSet.addAnimation(scale) |                                 animationSet.addAnimation(scale) | ||||||
|                                 animationSet.addAnimation(rotation) |                                 animationSet.addAnimation(rotation) | ||||||
|  |  | ||||||
|                                 view.doAnimation(context, animationSet) |                                 view.doAnimation(context, animationSet).then(() => { | ||||||
|  |                                     modal(context).toast('Animation finished') | ||||||
|  |                                 }) | ||||||
|                             } |                             } | ||||||
|                         }), |                         }), | ||||||
|                     ]).apply({ space: 10 } as IHLayout), |                     ]).apply({ space: 10 } as IHLayout), | ||||||
|   | |||||||
| @@ -317,6 +317,14 @@ - (void)doAnimation:(id)params withPromise:(DoricPromise *)promise { | |||||||
|     [self.view.layer addAnimation:animation forKey:nil]; |     [self.view.layer addAnimation:animation forKey:nil]; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | - (CFTimeInterval)computeDurationOfAnimations:(NSArray<CAAnimation *> *)animations { | ||||||
|  |     __block CFTimeInterval interval = 0; | ||||||
|  |     [animations forEach:^(CAAnimation *obj) { | ||||||
|  |         interval = MAX(interval, obj.beginTime + obj.duration * (1 + obj.repeatCount)); | ||||||
|  |     }]; | ||||||
|  |     return interval; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| - (CAAnimation *)parseAnimation:(id)params { | - (CAAnimation *)parseAnimation:(id)params { | ||||||
|     if ([params isKindOfClass:[NSArray class]]) { |     if ([params isKindOfClass:[NSArray class]]) { | ||||||
|         NSArray *anims = params; |         NSArray *anims = params; | ||||||
| @@ -325,6 +333,7 @@ - (CAAnimation *)parseAnimation:(id)params { | |||||||
|         [anims forEach:^(id obj) { |         [anims forEach:^(id obj) { | ||||||
|             [animations addObject:[self parseAnimation:obj]]; |             [animations addObject:[self parseAnimation:obj]]; | ||||||
|         }]; |         }]; | ||||||
|  |         animationGroup.duration = [self computeDurationOfAnimations:animations]; | ||||||
|         animationGroup.animations = animations; |         animationGroup.animations = animations; | ||||||
|         return animationGroup; |         return animationGroup; | ||||||
|     } else if ([params isKindOfClass:[NSDictionary class]]) { |     } else if ([params isKindOfClass:[NSDictionary class]]) { | ||||||
| @@ -346,6 +355,7 @@ - (CAAnimation *)parseAnimation:(id)params { | |||||||
|             }]; |             }]; | ||||||
|             animation.fromValue = [NSValue valueWithCGPoint:from]; |             animation.fromValue = [NSValue valueWithCGPoint:from]; | ||||||
|             animation.toValue = [NSValue valueWithCGPoint:to]; |             animation.toValue = [NSValue valueWithCGPoint:to]; | ||||||
|  |             [self setAnimation:animation params:params]; | ||||||
|             return animation; |             return animation; | ||||||
|         } else { |         } else { | ||||||
|             CAAnimationGroup *animationGroup = [CAAnimationGroup animation]; |             CAAnimationGroup *animationGroup = [CAAnimationGroup animation]; | ||||||
| @@ -354,19 +364,34 @@ - (CAAnimation *)parseAnimation:(id)params { | |||||||
|                 [animations addObject:[self parseChangeable:obj]]; |                 [animations addObject:[self parseChangeable:obj]]; | ||||||
|             }]; |             }]; | ||||||
|             animationGroup.animations = animations; |             animationGroup.animations = animations; | ||||||
|             animationGroup.duration = [params[@"duration"] floatValue] / 1000; |             [self setAnimation:animationGroup params:params]; | ||||||
|             if (params[@"delay"]) { |  | ||||||
|                 animationGroup.beginTime = CACurrentMediaTime() + [params[@"delay"] floatValue] / 1000; |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             return animationGroup; |             return animationGroup; | ||||||
|         } |         } | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     } |     } | ||||||
|     return nil; |     return nil; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | - (void)setAnimation:(CAAnimation *)animation params:(NSDictionary *)params { | ||||||
|  |     if (params[@"repeatCount"]) { | ||||||
|  |         NSInteger repeatCount = [params[@"repeatCount"] integerValue]; | ||||||
|  |         if (repeatCount < 0) { | ||||||
|  |             repeatCount = NSNotFound; | ||||||
|  |         } | ||||||
|  |         animation.repeatCount = repeatCount; | ||||||
|  |     } | ||||||
|  |     if (params[@"repeatMode"]) { | ||||||
|  |         NSInteger repeatMode = [params[@"repeatMode"] integerValue]; | ||||||
|  |         animation.autoreverses = repeatMode == 2; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (params[@"delay"]) { | ||||||
|  |         animation.beginTime = [params[@"delay"] floatValue] / 1000; | ||||||
|  |     } | ||||||
|  |     animation.duration = [params[@"duration"] floatValue] / 1000; | ||||||
|  |     animation.removedOnCompletion = NO; | ||||||
|  |     animation.fillMode = kCAFillModeForwards; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| - (CAAnimation *)parseChangeable:(NSDictionary *)params { | - (CAAnimation *)parseChangeable:(NSDictionary *)params { | ||||||
|     NSString *key = params[@"key"]; |     NSString *key = params[@"key"]; | ||||||
|     CABasicAnimation *animation = [CABasicAnimation animation]; |     CABasicAnimation *animation = [CABasicAnimation animation]; | ||||||
| @@ -387,17 +412,6 @@ - (CAAnimation *)parseChangeable:(NSDictionary *)params { | |||||||
|         animation.fromValue = params[@"fromValue"]; |         animation.fromValue = params[@"fromValue"]; | ||||||
|         animation.toValue = params[@"toValue"]; |         animation.toValue = params[@"toValue"]; | ||||||
|     } |     } | ||||||
|     if (params[@"repeatCount"]) { |  | ||||||
|         NSInteger repeatCount = [params[@"repeatCount"] integerValue]; |  | ||||||
|         if (repeatCount < 0) { |  | ||||||
|             repeatCount = NSNotFound; |  | ||||||
|         } |  | ||||||
|         animation.repeatCount = repeatCount; |  | ||||||
|     } |  | ||||||
|     if (params[@"repeatMode"]) { |  | ||||||
|         NSInteger repeatMode = [params[@"repeatMode"] integerValue]; |  | ||||||
|         animation.autoreverses = repeatMode == 2; |  | ||||||
|     } |  | ||||||
|     return animation; |     return animation; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|   | |||||||
| @@ -49,8 +49,6 @@ abstract class Animation implements IAnimation { | |||||||
|                 key: e.key, |                 key: e.key, | ||||||
|                 fromValue: e.fromValue, |                 fromValue: e.fromValue, | ||||||
|                 toValue: e.toValue, |                 toValue: e.toValue, | ||||||
|                 repeatCount: this.repeatCount, |  | ||||||
|                 repeatMode: this.repeatMode, |  | ||||||
|             }) |             }) | ||||||
|         } |         } | ||||||
|         return { |         return { | ||||||
| @@ -58,6 +56,8 @@ abstract class Animation implements IAnimation { | |||||||
|             delay: this.delay, |             delay: this.delay, | ||||||
|             duration: this.duration, |             duration: this.duration, | ||||||
|             changeables, |             changeables, | ||||||
|  |             repeatCount: this.repeatCount, | ||||||
|  |             repeatMode: this.repeatMode, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user