【2020欧洲杯官方投注-2020欧洲杯官方投注网址】

来源:http://www.boundlesssupremacy.com 作者:win7 人气:56 发布时间:2019-08-08
摘要:属性动画(展现动),属性动画展现动 个性动画 CAAnimationDelegate 在任何头文件中都找不到,但是能够在 CAAnimation 头文件大概苹果开拓者文书档案中找到有关函数。在那些事例中,大家用

属性动画(展现动),属性动画展现动

个性动画

CAAnimationDelegate在任何头文件中都找不到,但是能够在CAAnimation头文件大概苹果开拓者文书档案中找到有关函数。在那些事例中,大家用-animationDidStop:finished:方法在动画甘休之后来更新图层的backgroundColor

当更新属性的时候,我们供给设置多个新的事体,并且禁止使用图层行为。不然动画会发生四遍,四个是因为显式的CABasicAnimation,另一回是因为隐式动画,具体贯彻见订单8.3。

清单8.3 动画完成之后修改图层的背景观

2020欧洲杯官方投注-2020欧洲杯官方投注网址 12020欧洲杯官方投注-2020欧洲杯官方投注网址 2

 1 @implementation ViewController
 2 
 3 - (void)viewDidLoad
 4 {
 5     [super viewDidLoad];
 6     //create sublayer
 7     self.colorLayer = [CALayer layer];
 8     self.colorLayer.frame = CGRectMake(50.0f, 50.0f, 100.0f, 100.0f);
 9     self.colorLayer.backgroundColor = [UIColor blueColor].CGColor;
10     //add it to our view
11     [self.layerView.layer addSublayer:self.colorLayer];
12 }
13 
14 - (IBAction)changeColor
15 {
16     //create a new random color
17     CGFloat red = arc4random() / (CGFloat)INT_MAX;
18     CGFloat green = arc4random() / (CGFloat)INT_MAX;
19     CGFloat blue = arc4random() / (CGFloat)INT_MAX;
20     UIColor *color = [UIColor colorWithRed:red green:green blue:blue alpha:1.0];
21     //create a basic animation
22     CABasicAnimation *animation = [CABasicAnimation animation];
23     animation.keyPath = @"backgroundColor";
24     animation.toValue = (__bridge id)color.CGColor;
25     animation.delegate = self;
26     //apply animation to layer
27     [self.colorLayer addAnimation:animation forKey:nil];
28 }
29 
30 - (void)animationDidStop:(CABasicAnimation *)anim finished:(BOOL)flag
31 {
32     //set the backgroundColor property to match animation toValue
33     [CATransaction begin];
34     [CATransaction setDisableActions:YES];
35     self.colorLayer.backgroundColor = (__bridge CGColorRef)anim.toValue;
36     [CATransaction commit];
37 }
38 
39 @end

View Code

 

CAAnimation来讲,使用委托情势并不是二个成功块会带来三个难点,便是当你有多少个卡通的时候,不大概在在回调方法中区分。在一个视图调控器中开创动画的时候,平时会用调整器本身作为三个寄托(如清单8.3所示),可是具备的动画片都会调用同二个回调方法,所以您就须求判别究竟是非常图层的调用。

思虑一下第三章的时钟,“图层几何学”,大家通过轻松地每秒更新指针的角度来促成二个钟,但假如指针动态地转车新的岗位会非常从名称想到所包含的意义。

笔者们不可能透过隐式动画来促成因为这个指针都是UIView的实例,所以图层的隐式动画都被剥夺了。大家能够大约地经过UIView的动画方法来贯彻。但若是想更加好地操纵动画时间,使用显式动画会越来越好(更加多内容见第十章)。使用CABasicAnimation来做动画大概会尤其复杂,因为大家须求在-animationDidStop:finished:中检查实验指针状态(用于安装完成的职分)。

动画自个儿会作为四个参数字传送入委托的点子,大概你会以为能够调控器中把动画存款和储蓄为一个属性,然后在回调用相比,但实际并不起效能,因为委托传入的卡通片参数是原始值的叁个深拷贝,进并不是同贰个值。

当使用-addAnimation:forKey:把动画增多到图层,这里有三个到前段时间截止大家都设置为nilkey参数。这里的键是-animationForKey:办法找到相应动画的独一标记符,而当前卡通的全部键都能够用animationKeys收获。若是我们对各样动画都关涉叁个独一的键,就足以对每一个图层循环全体键,然后调用-animationForKey:来比对结果。纵然那不是多少个优雅的落到实处。

幸好的是,还只怕有一种尤其简便易行的措施。像全部的NSObject子类同样,CAAnimation贯彻了KVC(键-值-编码)协议,于是你能够用-setValue:forKey:-valueForKey:措施来存取属性。但是CAAnimation有多少个见仁见智的性情:它更像三个NSDictionary,能够让您随意安装键值对,纵然和你利用的卡通类所注脚的个性并不协作。

那意味你能够对动画用随机档期的顺序打标签。在此地,我们给UIView品类的指针增多的卡通,所以能够省略地认清动画到底属于哪个视图,然后在信托方法中用那几个音信精确地更新钟的指针(清单8.4)。

清单8.4 使用KVC对动画打标签

2020欧洲杯官方投注-2020欧洲杯官方投注网址 32020欧洲杯官方投注-2020欧洲杯官方投注网址 4

 1 @interface ViewController ()
 2 
 3 @property (nonatomic, weak) IBOutlet UIImageView *hourHand;
 4 @property (nonatomic, weak) IBOutlet UIImageView *minuteHand;
 5 @property (nonatomic, weak) IBOutlet UIImageView *secondHand;
 6 @property (nonatomic, weak) NSTimer *timer;
 7 
 8 @end
 9 
10 @implementation ViewController
11 
12 - (void)viewDidLoad
13 {
14     [super viewDidLoad];
15     //adjust anchor points
16     self.secondHand.layer.anchorPoint = CGPointMake(0.5f, 0.9f);
17     self.minuteHand.layer.anchorPoint = CGPointMake(0.5f, 0.9f);
18     self.hourHand.layer.anchorPoint = CGPointMake(0.5f, 0.9f);
19     //start timer
20     self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(tick) userInfo:nil repeats:YES];
21     //set initial hand positions
22     [self updateHandsAnimated:NO];
23 }
24 
25 - (void)tick
26 {
27     [self updateHandsAnimated:YES];
28 }
29 
30 - (void)updateHandsAnimated:(BOOL)animated
31 {
32     //convert time to hours, minutes and seconds
33     NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
34     NSUInteger units = NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
35     NSDateComponents *components = [calendar components:units fromDate:[NSDate date]];
36     CGFloat hourAngle = (components.hour / 12.0) * M_PI * 2.0;
37     //calculate hour hand angle //calculate minute hand angle
38     CGFloat minuteAngle = (components.minute / 60.0) * M_PI * 2.0;
39     //calculate second hand angle
40     CGFloat secondAngle = (components.second / 60.0) * M_PI * 2.0;
41     //rotate hands
42     [self setAngle:hourAngle forHand:self.hourHand animated:animated];
43     [self setAngle:minuteAngle forHand:self.minuteHand animated:animated];
44     [self setAngle:secondAngle forHand:self.secondHand animated:animated];
45 }
46 
47 - (void)setAngle:(CGFloat)angle forHand:(UIView *)handView animated:(BOOL)animated
48 {
49     //generate transform
50     CATransform3D transform = CATransform3DMakeRotation(angle, 0, 0, 1);
51     if (animated) {
52         //create transform animation
53         CABasicAnimation *animation = [CABasicAnimation animation];
54         [self updateHandsAnimated:NO];
55         animation.keyPath = @"transform";
56         animation.toValue = [NSValue valueWithCATransform3D:transform];
57         animation.duration = 0.5;
58         animation.delegate = self;
59         [animation setValue:handView forKey:@"handView"];
60         [handView.layer addAnimation:animation forKey:nil];
61     } else {
62         //set transform directly
63         handView.layer.transform = transform;
64     }
65 }
66 
67 - (void)animationDidStop:(CABasicAnimation *)anim finished:(BOOL)flag
68 {
69     //set final position for hand view
70     UIView *handView = [anim valueForKey:@"handView"];
71     handView.layer.transform = [anim.toValue CATransform3DValue];
72 }

View Code

 

笔者们成功的辨别出每一种图层甘休动画的年月,然后更新它的调换成一个新值,很好。

噩运的是,纵然做了那一个,如故有个难点,清单8.4在模拟器上运转的很好,但当真正跑在iOS设备上时,大家发掘在-animationDidStop:finished:寄托方法调用从前,指针会急迅回到到原始值,这一个清单8.3图层颜色发生的意况一样。

难点在于回调方法在动画达成在此之前已经被调用了,但无法确定保障那发生在质量动画重回初步状态此前。这同期也很好地证实了干吗要在实际的装备上测量检验动画代码,而不只是模拟器。

我们得以用贰个fillMode个性来消除这些标题,下一章会详细表明,这里明白在动画此前安装它比在动画截止之后更新属性越发有利。

性情动画

CAAnimationDelegate在任何头文件中都找不到,可是足以在CAAnimation头文件也许苹果开荒者文书档案中找到相关函数。在那一个例子中,我们用-animationDidStop:finished:措施在动画截止今后来更新图层的backgroundColor

当更新属性的时候,我们需求安装贰个新的业务,况兼禁止使用图层行为。否则动画会发生五回,八个是因为显式的CABasicAnimation,另三遍是因为隐式动画,具体贯彻见订单8.3。

清单8.3 动画达成以往修改图层的背景观

2020欧洲杯官方投注-2020欧洲杯官方投注网址 5

 1 @implementation ViewController
 2 
 3 - (void)viewDidLoad
 4 {
 5     [super viewDidLoad];
 6     //create sublayer
 7     self.colorLayer = [CALayer layer];
 8     self.colorLayer.frame = CGRectMake(50.0f, 50.0f, 100.0f, 100.0f);
 9     self.colorLayer.backgroundColor = [UIColor blueColor].CGColor;
10     //add it to our view
11     [self.layerView.layer addSublayer:self.colorLayer];
12 }
13 
14 - (IBAction)changeColor
15 {
16     //create a new random color
17     CGFloat red = arc4random() / (CGFloat)INT_MAX;
18     CGFloat green = arc4random() / (CGFloat)INT_MAX;
19     CGFloat blue = arc4random() / (CGFloat)INT_MAX;
20     UIColor *color = [UIColor colorWithRed:red green:green blue:blue alpha:1.0];
21     //create a basic animation
22     CABasicAnimation *animation = [CABasicAnimation animation];
23     animation.keyPath = @"backgroundColor";
24     animation.toValue = (__bridge id)color.CGColor;
25     animation.delegate = self;
26     //apply animation to layer
27     [self.colorLayer addAnimation:animation forKey:nil];
28 }
29 
30 - (void)animationDidStop:(CABasicAnimation *)anim finished:(BOOL)flag
31 {
32     //set the backgroundColor property to match animation toValue
33     [CATransaction begin];
34     [CATransaction setDisableActions:YES];
35     self.colorLayer.backgroundColor = (__bridge CGColorRef)anim.toValue;
36     [CATransaction commit];
37 }
38 
39 @end

View Code

 

CAAnimation来讲,使用委托格局实际不是贰个到位块会推动多个标题,正是当你有多少个卡通的时候,不大概在在回调方法中区分。在几个视图调控器中开创动画的时候,平日会用调控器本人作为三个寄托(如清单8.3所示),然而具备的卡通都会调用同三个回调方法,所以你就须要决断毕竟是那一个图层的调用。

思量一下第三章的石英钟,“图层几何学”,我们经过轻巧地每秒更新指针的角度来促成贰个钟,但借使指针动态地转车新的任务会更加的实事求是。

作者们不可能由此隐式动画来促成因为那些指针都以UIView的实例,所以图层的隐式动画都被剥夺了。大家得以大约地经过UIView的卡通片方法来贯彻。但一旦想越来越好地垄断(monopoly)动画时间,使用显式动画会更加好(越多内容见第十章)。使用CABasicAnimation来做动画也许会愈加复杂,因为我们要求在-animationDidStop:finished:中检查测量试验指针状态(用于安装结束的职位)。

动画本人会作为八个参数传入委托的点子,可能你会感觉能够调整器中把动画存储为贰性情能,然后在回调用比较,但其实并不起功效,因为委托传入的动画片参数是原始值的多少个深拷贝,进并非同二个值。

当使用-addAnimation:forKey:把动画增加到图层,这里有三个到近期停止大家都安装为nilkey参数。这里的键是-animationForKey:艺术找到呼应动画的独一标志符,而眼前动画的全数键都足以用animationKeys得到。假诺大家对各种动画都提到三个独一的键,就足以对各种图层循环全部键,然后调用-animationForKey:来比对结果。固然那不是二个优雅的落到实处。

幸而的是,还应该有一种尤其简明的措施。像全数的NSObject子类一样,CAAnimation兑现了KVC(键-值-编码)协议,于是你能够用-setValue:forKey:-valueForKey:方法来存取属性。但是CAAnimation有二个两样的习性:它更像叁个NSDictionary,能够让您轻巧安装键值对,固然和你使用的卡通类所申明的习性并不合营。

那意味着你能够对动画用随机等级次序打标签。在那边,我们给UIView项目标指针增添的卡通,所以可以轻便地认清动画到底属于哪个视图,然后在信托方法中用那一个新闻准确地更新钟的指针(清单8.4)。

清单8.4 使用KVC对动画片打标签

2020欧洲杯官方投注-2020欧洲杯官方投注网址 6

 1 @interface ViewController ()
 2 
 3 @property (nonatomic, weak) IBOutlet UIImageView *hourHand;
 4 @property (nonatomic, weak) IBOutlet UIImageView *minuteHand;
 5 @property (nonatomic, weak) IBOutlet UIImageView *secondHand;
 6 @property (nonatomic, weak) NSTimer *timer;
 7 
 8 @end
 9 
10 @implementation ViewController
11 
12 - (void)viewDidLoad
13 {
14     [super viewDidLoad];
15     //adjust anchor points
16     self.secondHand.layer.anchorPoint = CGPointMake(0.5f, 0.9f);
17     self.minuteHand.layer.anchorPoint = CGPointMake(0.5f, 0.9f);
18     self.hourHand.layer.anchorPoint = CGPointMake(0.5f, 0.9f);
19     //start timer
20     self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(tick) userInfo:nil repeats:YES];
21     //set initial hand positions
22     [self updateHandsAnimated:NO];
23 }
24 
25 - (void)tick
26 {
27     [self updateHandsAnimated:YES];
28 }
29 
30 - (void)updateHandsAnimated:(BOOL)animated
31 {
32     //convert time to hours, minutes and seconds
33     NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
34     NSUInteger units = NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
35     NSDateComponents *components = [calendar components:units fromDate:[NSDate date]];
36     CGFloat hourAngle = (components.hour / 12.0) * M_PI * 2.0;
37     //calculate hour hand angle //calculate minute hand angle
38     CGFloat minuteAngle = (components.minute / 60.0) * M_PI * 2.0;
39     //calculate second hand angle
40     CGFloat secondAngle = (components.second / 60.0) * M_PI * 2.0;
41     //rotate hands
42     [self setAngle:hourAngle forHand:self.hourHand animated:animated];
43     [self setAngle:minuteAngle forHand:self.minuteHand animated:animated];
44     [self setAngle:secondAngle forHand:self.secondHand animated:animated];
45 }
46 
47 - (void)setAngle:(CGFloat)angle forHand:(UIView *)handView animated:(BOOL)animated
48 {
49     //generate transform
50     CATransform3D transform = CATransform3DMakeRotation(angle, 0, 0, 1);
51     if (animated) {
52         //create transform animation
53         CABasicAnimation *animation = [CABasicAnimation animation];
54         [self updateHandsAnimated:NO];
55         animation.keyPath = @"transform";
56         animation.toValue = [NSValue valueWithCATransform3D:transform];
57         animation.duration = 0.5;
58         animation.delegate = self;
59         [animation setValue:handView forKey:@"handView"];
60         [handView.layer addAnimation:animation forKey:nil];
61     } else {
62         //set transform directly
63         handView.layer.transform = transform;
64     }
65 }
66 
67 - (void)animationDidStop:(CABasicAnimation *)anim finished:(BOOL)flag
68 {
69     //set final position for hand view
70     UIView *handView = [anim valueForKey:@"handView"];
71     handView.layer.transform = [anim.toValue CATransform3DValue];
72 }

View Code

 

笔者们成功的甄别出每个图层甘休动画的年华,然后更新它的改形成多少个新值,很好。

倒霉的是,即便做了这么些,照旧有个难点,清单8.4在模拟器上运转的很好,但当真正跑在iOS设备上时,大家发掘在-animationDidStop:finished:信托方法调用以前,指针会快捷回到到原始值,那些清单8.3图层颜色产生的情事一致。

题目在于回调方法在动画达成以前早就被调用了,但不能保障那产生在质量动画重返伊始状态在此以前。那同一时间也很好地证实了干吗要在实际的配备上测验动画代码,而不只是模拟器。

大家得以用一个fillMode本性来解决这些主题材料,下一章会详细表达,这里领悟在动画从前安装它比在动画截止之后更新属性尤其有益。

重在帧动画

CABasicAnimation表露了绝大比较多隐式动画背后正视的建制,那的确很风趣,可是显式地给图层增多CABasicAnimation相较于隐式动画来讲,只可以说万事伊始难不捧场。

CAKeyframeAnimation是另一种UIKit未有暴流露来但作用强大的类。和CABasicAnimation类似,CAKeyframeAnimation同样是CAPropertyAnimation的一个子类,它依然成效于单纯的四天性质,可是和CABasicAnimation分裂的是,它不限制于设置贰个开场和终止的值,而是能够依赖一种类随便的值来做动画。

关键帧起点于传动动画,意思是指中央的动画在大廷广众退换产生时重绘当前帧(也正是关键帧),每帧之间剩下的绘图(能够透过关键帧推算出)将由内行的歌唱家来产生。CAKeyframeAnimation也是同一的道理:你提供了显然的帧,然后Core Animation在每帧之间开始展览扦插。

咱俩得以用事先运用颜色图层的例证来演示,设置四个颜料的数组,然后经过机要帧动画播放出来(清单8.5)

清单8.5 使用CAKeyframeAnimation运用一多级颜色的改变

2020欧洲杯官方投注-2020欧洲杯官方投注网址 72020欧洲杯官方投注-2020欧洲杯官方投注网址 8

 1 - (IBAction)changeColor
 2 {
 3     //create a keyframe animation
 4     CAKeyframeAnimation *animation = [CAKeyframeAnimation animation];
 5     animation.keyPath = @"backgroundColor";
 6     animation.duration = 2.0;
 7     animation.values = @[
 8                          (__bridge id)[UIColor blueColor].CGColor,
 9                          (__bridge id)[UIColor redColor].CGColor,
10                          (__bridge id)[UIColor greenColor].CGColor,
11                          (__bridge id)[UIColor blueColor].CGColor ];
12     //apply animation to layer
13     [self.colorLayer addAnimation:animation forKey:nil];
14 }

View Code

 

专注到行列中初阶和竣事的颜料都以藤黄,那是因为CAKeyframeAnimation并无法活动把当前值作为第一帧(就像是CABasicAnimation那样把fromValue设为nil)。动画会在始发的时候猛然跳转到第一帧的值,然后在动画结束的时候忽然回涨到原有的值。所认为了动画的平滑天性,我们须求起初和完工的关键帧来协作当前品质的值。

当然能够创制贰个完成和起来值差别的卡通,那样的话就须要在动画运转此前手动更新属性和终极一帧的值保持一致,就和后边研讨的一样。

我们用duration性子把动画时间从暗中同意的0.25秒扩张到2秒,以便于动画做的不那么快。运营它,你会发觉动画通过颜色不断循环,但作用看起来有个别奇怪。原因在于动画以二个永远的步骤在运维。当在每个动画之间连结的时候并不曾放缓,那就产生了一个略微奇异的意义,为了让动画看起来更自然,大家供给调动一下缓冲,第十章将会详细表明。

提供二个数组的值就能够依照颜色变化做动画,但一般的话用数组来描述动画运动并不直观。CAKeyframeAnimation有另一种办法去钦赐动画,正是应用CGPathpath质量能够用一种直观的艺术,使用Core Graphics函数定义运动类别来绘制动画。

我们来用三个星体飞船沿着五个差十分少曲线的实例演示一下。为了创造路线,我们需求运用四个三次贝塞尔曲线,它是一种选取起来点,甘休点和另外几个控制点来定义形状的曲线,能够由此选拔贰个基于C的Core Graphics绘图指令来创设,可是用UIKit提供的UIBezierPath类会更简便。

大家此次用CAShapeLayer来在显示屏上绘制曲线,固然对动画片来讲并不是必须的,但那会让大家的卡通特别形象。绘制完CGPath以后,我们用它来创制贰个CAKeyframeAnimation,然后用它来采用到大家的宇宙空间飞船。代码见清单8.6,结果见图8.1。

清单8.6 沿着多少个贝塞尔曲线对图层做动画

2020欧洲杯官方投注-2020欧洲杯官方投注网址 92020欧洲杯官方投注-2020欧洲杯官方投注网址 10

 1 @interface ViewController ()
 2 
 3 @property (nonatomic, weak) IBOutlet UIView *containerView;
 4 
 5 @end
 6 
 7 @implementation ViewController
 8 
 9 - (void)viewDidLoad
10 {
11     [super viewDidLoad];
12     //create a path
13     UIBezierPath *bezierPath = [[UIBezierPath alloc] init];
14     [bezierPath moveToPoint:CGPointMake(0, 150)];
15     [bezierPath addCurveToPoint:CGPointMake(300, 150) controlPoint1:CGPointMake(75, 0) controlPoint2:CGPointMake(225, 300)];
16     //draw the path using a CAShapeLayer
17     CAShapeLayer *pathLayer = [CAShapeLayer layer];
18     pathLayer.path = bezierPath.CGPath;
19     pathLayer.fillColor = [UIColor clearColor].CGColor;
20     pathLayer.strokeColor = [UIColor redColor].CGColor;
21     pathLayer.lineWidth = 3.0f;
22     [self.containerView.layer addSublayer:pathLayer];
23     //add the ship
24     CALayer *shipLayer = [CALayer layer];
25     shipLayer.frame = CGRectMake(0, 0, 64, 64);
26     shipLayer.position = CGPointMake(0, 150);
27     shipLayer.contents = (__bridge id)[UIImage imageNamed: @"Ship.png"].CGImage;
28     [self.containerView.layer addSublayer:shipLayer];
29     //create the keyframe animation
30     CAKeyframeAnimation *animation = [CAKeyframeAnimation animation];
31     animation.keyPath = @"position";
32     animation.duration = 4.0;
33     animation.path = bezierPath.CGPath;
34     [shipLayer addAnimation:animation forKey:nil];
35 }
36 
37 @end

View Code

 2020欧洲杯官方投注-2020欧洲杯官方投注网址 11

图8.1 沿着一个贝塞尔曲线移动的宇宙飞船图片

运转示例,你会意识飞船的动画有个别不太实在,那是因为当它运动的时候永世指向侧边,并不是指向曲线切线的侧向。你能够调节它的affineTransform来对活动方向做动画,但很恐怕和别的的卡通争辨。

碰巧的是,苹果预知到了那一点,而且给CAKeyFrameAnimation增加了叁个rotationMode的属性。设置它为常量kCAAnimationRotateAuto(清单8.7),图层将会依靠曲线的切线自动旋转(图8.2)。

清单8.7 通过rotationMode活动对齐图层到曲线

 1 - (void)viewDidLoad
 2 {
 3     [super viewDidLoad];
 4     //create a path
 5     ...
 6     //create the keyframe animation
 7     CAKeyframeAnimation *animation = [CAKeyframeAnimation animation];
 8     animation.keyPath = @"position";
 9     animation.duration = 4.0;
10     animation.path = bezierPath.CGPath;
11     animation.rotationMode = kCAAnimationRotateAuto;
12     [shipLayer addAnimation:animation forKey:nil];
13 }

2020欧洲杯官方投注-2020欧洲杯官方投注网址 12

图8.2 匹配曲线切线方向的飞艇图层

本文由2020欧洲杯官方投注-2020欧洲杯官方投注网址发布于win7,转载请注明出处:【2020欧洲杯官方投注-2020欧洲杯官方投注网址】

关键词: 欧洲杯彩票 核心动画

上一篇:Hadoop配置机架感知(Python脚本)

下一篇:没有了

最火资讯