You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by ac...@apache.org on 2018/04/18 08:56:04 UTC
incubator-weex git commit: [WEEX-295] Rebuild transition's code and
improve performance
Repository: incubator-weex
Updated Branches:
refs/heads/master 39c85a3e1 -> a8de4388f
[WEEX-295] Rebuild transition's code and improve performance
[WEEX-295] [iOS] Rebuild transition's code and improve performance
close #1118
Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/a8de4388
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/a8de4388
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/a8de4388
Branch: refs/heads/master
Commit: a8de4388fea846d8f3ebcec441741dfeacc61db4
Parents: 39c85a3
Author: doumafang <do...@gmail.com>
Authored: Wed Apr 18 16:13:40 2018 +0800
Committer: acton393 <zh...@gmail.com>
Committed: Wed Apr 18 16:55:08 2018 +0800
----------------------------------------------------------------------
.../WeexSDK/Sources/Module/WXAnimationModule.m | 18 +--
ios/sdk/WeexSDK/Sources/Module/WXTransition.h | 4 +-
ios/sdk/WeexSDK/Sources/Module/WXTransition.m | 149 +++++++++++--------
3 files changed, 95 insertions(+), 76 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/a8de4388/ios/sdk/WeexSDK/Sources/Module/WXAnimationModule.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXAnimationModule.m b/ios/sdk/WeexSDK/Sources/Module/WXAnimationModule.m
index 9d5812d..a619166 100644
--- a/ios/sdk/WeexSDK/Sources/Module/WXAnimationModule.m
+++ b/ios/sdk/WeexSDK/Sources/Module/WXAnimationModule.m
@@ -305,11 +305,11 @@ WX_EXPORT_METHOD(@selector(transition:args:callback:))
- (void)animationWithTransitionTarget:(WXComponent *)target handleProperty:(NSString *)property withDic:(NSDictionary *)args
{
NSDictionary *styles = args[@"styles"];
- _transition.addStyles = [NSMutableDictionary dictionaryWithDictionary:styles];
- _transition.fromStyles =_transition.fromStyles ? :[NSMutableDictionary dictionaryWithDictionary:target.styles] ;
- [_transition.fromStyles setObject:@([args[@"duration"] doubleValue]) forKey:kWXTransitionDuration];
- [_transition.fromStyles setObject:@([args[@"delay"] doubleValue]) forKey:kWXTransitionDelay];
- NSString *oldProperty = _transition.fromStyles[kWXTransitionProperty];
+ _transition.filterStyles = [NSMutableDictionary dictionaryWithDictionary:styles];
+ _transition.oldFilterStyles =_transition.oldFilterStyles ? :[NSMutableDictionary dictionaryWithDictionary:target.styles] ;
+ [_transition.oldFilterStyles setObject:@([args[@"duration"] doubleValue]) forKey:kWXTransitionDuration];
+ [_transition.oldFilterStyles setObject:@([args[@"delay"] doubleValue]) forKey:kWXTransitionDelay];
+ NSString *oldProperty = _transition.oldFilterStyles[kWXTransitionProperty];
NSString *newProperty;
if (oldProperty) {
if ([oldProperty containsString:property]) {
@@ -324,11 +324,11 @@ WX_EXPORT_METHOD(@selector(transition:args:callback:))
{
newProperty = property;
}
- [_transition.fromStyles setObject:newProperty forKey:kWXTransitionProperty];
- [_transition.fromStyles setObject:args[@"timingFunction"] forKey:kWXTransitionTimingFunction];
+ [_transition.oldFilterStyles setObject:newProperty forKey:kWXTransitionProperty];
+ [_transition.oldFilterStyles setObject:args[@"timingFunction"] forKey:kWXTransitionTimingFunction];
[target _modifyStyles:styles];
-
}
+
- (void)animation:(WXComponent *)targetComponent args:(NSDictionary *)args callback:(WXModuleKeepAliveCallback)callback
{
/**
@@ -361,7 +361,7 @@ WX_EXPORT_METHOD(@selector(transition:args:callback:))
[CATransaction commit];
if (_needLayout) {
WXPerformBlockOnComponentThread(^{
- [_transition _handleTransitionWithStyles:_transition.addStyles resetStyles:nil target:targetComponent];
+ [_transition _handleTransitionWithStyles:_transition.filterStyles resetStyles:nil target:targetComponent];
});
}
}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/a8de4388/ios/sdk/WeexSDK/Sources/Module/WXTransition.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXTransition.h b/ios/sdk/WeexSDK/Sources/Module/WXTransition.h
index b832e3e..92ea0cf 100644
--- a/ios/sdk/WeexSDK/Sources/Module/WXTransition.h
+++ b/ios/sdk/WeexSDK/Sources/Module/WXTransition.h
@@ -46,8 +46,8 @@ typedef NS_OPTIONS(NSUInteger, WXTransitionOptions) {
@end
@interface WXTransition : NSObject
-@property(nonatomic,strong) NSMutableDictionary *fromStyles;
-@property(nonatomic,strong) NSMutableDictionary *addStyles;
+@property(nonatomic,strong) NSMutableDictionary *oldFilterStyles;
+@property(nonatomic,strong) NSMutableDictionary *filterStyles;
@property(nonatomic,strong) NSMutableArray *propertyArray;
@property(nonatomic,assign) WXTransitionOptions transitionOptions;
- (instancetype) initWithStyles:(NSDictionary *)styles;
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/a8de4388/ios/sdk/WeexSDK/Sources/Module/WXTransition.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXTransition.m b/ios/sdk/WeexSDK/Sources/Module/WXTransition.m
index ddb7e98..8e982ac 100644
--- a/ios/sdk/WeexSDK/Sources/Module/WXTransition.m
+++ b/ios/sdk/WeexSDK/Sources/Module/WXTransition.m
@@ -32,13 +32,11 @@
#import "WXLength.h"
@implementation WXTransitionInfo
-
@end
@interface WXTransition()
{
WXComponent *_targetComponent;
-
double ax;
double bx;
double cx;
@@ -54,37 +52,47 @@
CAMediaTimingFunction *_transitionTimingFunction;
CADisplayLink *_transitionDisplayLink;
- NSMutableDictionary *_toStyles;
- NSMutableDictionary *_fromStyles;
- NSMutableDictionary *_addStyles;
+ NSMutableDictionary *_filterStyles;
+ NSMutableDictionary *_oldFilterStyles;
}
@end
@implementation WXTransition
-
- (instancetype)initWithStyles:(NSDictionary *)styles
{
if (self = [super init]) {
NSString *property = styles[kWXTransitionProperty];
- _transitionOptions |= [property containsString:@"width"]? WXTransitionOptionsWidth:0;
- _transitionOptions |= [property containsString:@"height"]? WXTransitionOptionsHeight:0;
- _transitionOptions |= [property containsString:@"right"]? WXTransitionOptionsRight:0;
- _transitionOptions |= [property containsString:@"left"]? WXTransitionOptionsLeft:0;
- _transitionOptions |= [property containsString:@"bottom"]? WXTransitionOptionsBottom:0;
- _transitionOptions |= [property containsString:@"top"]? WXTransitionOptionsTop:0;
- _transitionOptions |= [property containsString:@"backgroundColor"]? WXTransitionOptionsBackgroundColor:0;
- _transitionOptions |= [property containsString:@"transform"]? WXTransitionOptionsTransform:0;
- _transitionOptions |= [property containsString:@"opacity"]? WXTransitionOptionsOpacity:0;
+ NSArray *properties = [property componentsSeparatedByString:@","];
+ for (NSString *string in properties) {
+ _transitionOptions |= [self transitionOptionsFromString:string];
+ }
}
return self;
}
#pragma mark - HandleStyle
+- (WXTransitionOptions)transitionOptionsFromString:(NSString *)string
+{
+ NSDictionary<NSString*,NSNumber*> *options = @{
+ @"width": @(WXTransitionOptionsWidth),
+ @"height": @(WXTransitionOptionsHeight),
+ @"right": @(WXTransitionOptionsRight),
+ @"left": @(WXTransitionOptionsLeft),
+ @"bottom": @(WXTransitionOptionsBottom),
+ @"top": @(WXTransitionOptionsTop),
+ @"backgroundColor": @(WXTransitionOptionsBackgroundColor),
+ @"transform": @(WXTransitionOptionsTransform),
+ @"opacity": @(WXTransitionOptionsOpacity),
+ };
+ return options[string].integerValue;
+}
+
- (void)_handleTransitionWithStyles:(NSDictionary *)styles resetStyles:(NSMutableArray *)resetStyles target:(WXComponent *)targetComponent
{
- if ([self _isTransitionRunning]) {
+ BOOL isRunning = [self _isTransitionRunning];
+ if (isRunning) {
[self _rollBackTransitionWithStyles:styles];
}
else
@@ -92,28 +100,36 @@
[self _suspendTransitionDisplayLink];
}
- _targetComponent = targetComponent;
- if (!_fromStyles) {
- _fromStyles = [NSMutableDictionary dictionaryWithDictionary:targetComponent.styles];
- _addStyles = [NSMutableDictionary dictionaryWithDictionary:styles];
- }
- else
- {
- [_addStyles addEntriesFromDictionary:styles];
- }
- _toStyles = [NSMutableDictionary dictionaryWithDictionary:_fromStyles];
- [_toStyles addEntriesFromDictionary:_addStyles];
+ _filterStyles = _filterStyles ?:[NSMutableDictionary new];
+ _oldFilterStyles = _oldFilterStyles ?: [NSMutableDictionary new];
+ NSMutableDictionary *futileStyles = [NSMutableDictionary new];
- _transitionDuration = _fromStyles[kWXTransitionDuration] ? [WXConvert CGFloat:_fromStyles[kWXTransitionDuration]] : 0;
- _transitionDelay = _fromStyles[kWXTransitionDelay] ? [WXConvert CGFloat:_fromStyles[kWXTransitionDelay]] : 0;
- _transitionTimingFunction = [WXConvert CAMediaTimingFunction:_fromStyles[kWXTransitionTimingFunction]];
+ for (NSString *key in styles) {
+ if (self.transitionOptions & [self transitionOptionsFromString:key]) {
+ [_filterStyles setObject:styles[key] forKey:key];
+ if (![key isEqualToString:@"transform"]) {
+ if (!isRunning) {
+ [_oldFilterStyles setObject:targetComponent.styles[key] forKey:key];
+ }
+ }
+ }
+ else
+ {
+ [futileStyles setObject:styles[key] forKey:key];
+ }
+ }
+ [self updateFutileStyles:futileStyles resetStyles:nil target:targetComponent];
+
+ _targetComponent = targetComponent;
+ NSMutableDictionary *componentStyles = [NSMutableDictionary dictionaryWithDictionary:styles];
+ [componentStyles addEntriesFromDictionary:targetComponent.styles];
+
+ _transitionDuration = componentStyles[kWXTransitionDuration] ? [WXConvert CGFloat:componentStyles[kWXTransitionDuration]] : 0;
+ _transitionDelay = componentStyles[kWXTransitionDelay] ? [WXConvert CGFloat:componentStyles[kWXTransitionDelay]] : 0;
+ _transitionTimingFunction = [WXConvert CAMediaTimingFunction:componentStyles[kWXTransitionTimingFunction]];
if (_transitionDuration == 0 ) {
- [targetComponent _updateCSSNodeStyles:styles];
- [targetComponent _resetCSSNodeStyles:resetStyles];
- WXPerformBlockOnMainThread(^{
- [targetComponent _updateViewStyles:styles];
- });
+ [self updateFutileStyles:_filterStyles resetStyles:nil target:targetComponent];
return;
}
@@ -124,11 +140,19 @@
[self unitBezierp1x:vec[0] p1y:vec[1] p2x:vec[2] p2y:vec[3]];
}
- NSString *transitionProperty = _fromStyles[kWXTransitionProperty];
- [self _resloveTransitionProperty:transitionProperty withStyles:styles];
+ [self _resloveTransitionProperty];
[self performSelector:@selector(_startTransitionDisplayLink) withObject:self afterDelay:_transitionDelay/1000];
}
+- (void)updateFutileStyles:(NSDictionary *)styles resetStyles:(NSMutableArray *)resetStyles target:(WXComponent *)targetComponent
+{
+ [targetComponent _updateCSSNodeStyles:styles];
+ [targetComponent _resetCSSNodeStyles:resetStyles];
+ WXPerformBlockOnMainThread(^{
+ [targetComponent _updateViewStyles:styles];
+ });
+}
+
- (void)_rollBackTransitionWithStyles:(NSDictionary *)styles
{
_transitionDuration = _transitionCount * 1000 / 60;
@@ -136,36 +160,34 @@
_propertyArray = nil;
}
-- (void)_resloveTransitionProperty:(NSString *)propertyNames withStyles:(NSDictionary *)styles
+- (void)_resloveTransitionProperty
{
- if (styles.count == 0) {
+ if (_filterStyles.count == 0) {
return;
}
- for (NSString * name in styles.allKeys) {
- if ([propertyNames containsString:name]) {
- [self _dealTransitionWithProperty:name styles:styles];
- }
+ for (NSString * name in _filterStyles.allKeys) {
+ [self _dealTransitionWithProperty:name];
}
}
-- (void)_dealTransitionWithProperty:(NSString *)singleProperty styles:(NSDictionary *)styles
+- (void)_dealTransitionWithProperty:(NSString *)singleProperty
{
- if (styles[singleProperty])
+ if (_filterStyles[singleProperty])
{
if (!_propertyArray) {
_propertyArray = [NSMutableArray new];
}
if ([singleProperty isEqualToString:@"backgroundColor"]) {
WXTransitionInfo *info = [WXTransitionInfo new];
- info.fromValue = [self _dealWithColor:[WXConvert UIColor:_fromStyles[singleProperty]]];
- info.toValue = [self _dealWithColor:[WXConvert UIColor:_toStyles[singleProperty]]];
+ info.fromValue = [self _dealWithColor:[WXConvert UIColor:_oldFilterStyles[singleProperty]]];
+ info.toValue = [self _dealWithColor:[WXConvert UIColor:_filterStyles[singleProperty]]];
info.perValue = [self _calculatePerColorRGB1:info.toValue RGB2:info.fromValue];
info.propertyName = singleProperty;
[_propertyArray addObject:info];
}
else if ([singleProperty isEqualToString:@"transform"]) {
- NSString *transformOrigin = styles[@"transformOrigin"];
- WXTransform *wxTransform = [[WXTransform alloc] initWithCSSValue:_toStyles[singleProperty] origin:transformOrigin instance:_targetComponent.weexInstance];
+ NSString *transformOrigin = _filterStyles[@"transformOrigin"];
+ WXTransform *wxTransform = [[WXTransform alloc] initWithCSSValue:_filterStyles[singleProperty] origin:transformOrigin instance:_targetComponent.weexInstance];
WXTransform *oldTransform = _targetComponent->_transform;
if (wxTransform.rotateAngle != oldTransform.rotateAngle) {
WXTransitionInfo *info = [WXTransitionInfo new];
@@ -239,8 +261,8 @@
else
{
WXTransitionInfo *info = [WXTransitionInfo new];
- info.fromValue = @(_fromStyles[singleProperty] ? [WXConvert CGFloat:_fromStyles[singleProperty]] : 0);
- info.toValue = @(_toStyles[singleProperty] ? [WXConvert CGFloat:_toStyles[singleProperty]] : 0 );
+ info.fromValue = @(_oldFilterStyles[singleProperty] ? [WXConvert CGFloat:_oldFilterStyles[singleProperty]] : 0);
+ info.toValue = @(_filterStyles[singleProperty] ? [WXConvert CGFloat:_filterStyles[singleProperty]] : 0 );
info.perValue = @([info.toValue doubleValue] - [info.fromValue doubleValue]);
info.propertyName = singleProperty;
[_propertyArray addObject:info];
@@ -287,7 +309,7 @@
[_targetComponent.view setNeedsDisplay];
});
NSString *colorString = [WXConvert HexWithColor:color];
- [_fromStyles setObject:colorString forKey:info.propertyName];
+ [_oldFilterStyles setObject:colorString forKey:info.propertyName];
}
else if ([info.propertyName hasPrefix:@"transform"])
{
@@ -325,18 +347,18 @@
newString = [NSString stringWithFormat:@"translateY(%lfpx)",currentValue / _targetComponent.weexInstance.pixelScaleFactor];
transformString = [transformString stringByAppendingFormat:@" %@",newString];
}
- [_fromStyles setObject:transformString forKey:@"transform"];
+ [_oldFilterStyles setObject:transformString forKey:@"transform"];
}
else
{
double currentValue = [info.fromValue doubleValue] + [info.perValue doubleValue] * per;
- [_fromStyles setObject:@(currentValue) forKey:info.propertyName];
+ [_oldFilterStyles setObject:@(currentValue) forKey:info.propertyName];
}
}
WXPerformBlockOnMainThread(^{
- [_targetComponent _updateViewStyles:_fromStyles];
+ [_targetComponent _updateViewStyles:_oldFilterStyles];
});
- [_targetComponent _updateCSSNodeStyles:_fromStyles];
+ [_targetComponent _updateCSSNodeStyles:_oldFilterStyles];
[_targetComponent.weexInstance.componentManager startComponentTasks];
}
@@ -409,20 +431,18 @@
_transitionCount = 0;
_transitionDuration = 0;
_propertyArray = nil;
-
- _addStyles = nil;
- _fromStyles = nil;
- _toStyles = nil;
+ _oldFilterStyles = nil;
+ _filterStyles= nil;
}
-- (NSMutableDictionary *)_addStyles
+- (NSMutableDictionary *)_filterStyles
{
- return self.addStyles;
+ return self.filterStyles;
}
-- (NSMutableDictionary *)_fromStyles
+- (NSMutableDictionary *)_oldFilterStyles
{
- return self.fromStyles;
+ return self.oldFilterStyles;
}
#pragma mark UnitBezierp
@@ -496,5 +516,4 @@
{
return [self sampleCurveY:([self solveCurveX:x epsilon:epsilon])];
}
-
@end