17-核心動畫實戰(zhàn)

轉(zhuǎn)盤(旋轉(zhuǎn))

  • 自定義轉(zhuǎn)盤上的button - WheelButton
    • 事件處理怕犁,重寫hitTest方法來尋找最合適的view
// 尋找最合適的view
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    // 獲取真實button的寬度和高度
    CGFloat btnW = self.bounds.size.width;
    CGFloat btnH = self.bounds.size.height;

    // 設(shè)置要處理事件的區(qū)域    
    CGFloat x = 0;
    CGFloat y = btnH / 2;
    CGFloat w = btnW;
    CGFloat h = y;
    CGRect rect = CGRectMake(x, y, w, h);
    if (CGRectContainsPoint(rect, point)) {
        return nil;
    }else{
        return [super hitTest:point withEvent:event];
    }
    
}
  • 自定義按鈕可以控制按鈕上圖片顯示的位置和尺寸
// 設(shè)置UIImageView的尺寸
// contentRect:按鈕的尺寸
- (CGRect)imageRectForContentRect:(CGRect)contentRect
{
    // 計算UIImageView控件尺寸
    CGFloat imageW = 40;
    CGFloat imageH = 46;
    CGFloat imageX = (contentRect.size.width - imageW) * 0.5;
    CGFloat imageY = 20;
    return CGRectMake(imageX, imageY, imageW, imageH);
}
  • 自定義按鈕取消點擊時的高亮狀態(tài),需重寫setHighlighted方法
// 取消高亮狀態(tài)
- (void)setHighlighted:(BOOL)highlighted
{
    
}
  • 自定義轉(zhuǎn)盤的view - WheelView
    • 在.h文件中聲明初始化方法和start以及pause方法
+ (instancetype)wheelView;
- (void)start
- (void)pause
  • 在wheelView初始化方法中加載xib文件
+ (instancetype)wheelView
{
   return  [[NSBundle mainBundle] loadNibNamed:@"WheelView" owner:nil options:nil][0];
}
  • initWithCoder方法只是在加載xib的時候會調(diào)用鸽凶,但是并不會將xib中的控件和代碼聲明進(jìn)行連線
  • 可以在awakeFromNib方法中進(jìn)行添加按鈕的操作
- (void)awakeFromNib
{
    // 由于imageView的特殊性,默認(rèn)是不能與用戶進(jìn)行交互的
    _centerView.userInteractionEnabled = YES;
    CGFloat btnW = 68;
    CGFloat btnH = 143;
    
    CGFloat wh = self.bounds.size.width;
    
    // 加載大圖片(默認(rèn))
    UIImage *bigImage = [UIImage imageNamed:@"LuckyAstrology"];
    
    // 加載大圖片(選中)
    UIImage *selBigImage = [UIImage imageNamed:@"LuckyAstrologyPressed"];
    
    // 獲取當(dāng)前使用的圖片像素和點的比例
    CGFloat scale = [UIScreen mainScreen].scale;
    CGFloat imageW = bigImage.size.width / 12 * scale;
    CGFloat imageH = bigImage.size.height * scale;
    // CGImageRef image:需要裁減的圖片
    // rect:裁減區(qū)域
    // 裁減區(qū)域是以像素為基準(zhǔn)
    // CGImageCreateWithImageInRect(CGImageRef image, CGRect rect)
    
    // 添加按鈕
    for (int i = 0; i < 12; i++) {
        WheelButton *btn = [WheelButton buttonWithType:UIButtonTypeCustom];
        
        // 設(shè)置按鈕的位置
        btn.layer.anchorPoint = CGPointMake(0.5, 1);
        
        btn.bounds = CGRectMake(0, 0, btnW, btnH);
        
        btn.layer.position = CGPointMake(wh * 0.5, wh * 0.5);
        
        // 按鈕的旋轉(zhuǎn)角度
        CGFloat radion = (30 * i) / 180.0 * M_PI;
        
        btn.transform = CGAffineTransformMakeRotation(radion);
        
        [_centerView addSubview:btn];
        
        // 加載按鈕的圖片
        // 計算裁減區(qū)域
        CGRect clipR = CGRectMake(i * imageW, 0, imageW, imageH);
        
        // 裁減圖片
        CGImageRef imgR =  CGImageCreateWithImageInRect(bigImage.CGImage, clipR);
        
        UIImage *image = [UIImage imageWithCGImage:imgR];
        
        // 設(shè)置按鈕的圖片
        [btn setImage:image forState:UIControlStateNormal];
        
        // 設(shè)置選中狀態(tài)下圖片
        imgR = CGImageCreateWithImageInRect(selBigImage.CGImage, clipR);

        image = [UIImage imageWithCGImage:imgR];
        
        // 設(shè)置按鈕的圖片
        [btn setImage:image forState:UIControlStateSelected];
        
        // 設(shè)置選中背景圖片
        [btn setBackgroundImage:[UIImage imageNamed:@"LuckyRototeSelected"] forState:UIControlStateSelected];
        
        // 監(jiān)聽按鈕的點擊
        [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
        
        // 默認(rèn)選中第一個
        if (i == 0) {
            [self btnClick:btn];
        }
        
        // btn.backgroundColor = [UIColor redColor];
    }
}
  • 默認(rèn)記錄上一次被點擊的按鈕建峭,當(dāng)點擊下一個按鈕時清空上一個按鈕玻侥,并將當(dāng)前按鈕記錄
- (void)btnClick:(UIButton *)btn
{
    _selBtn.selected = NO;
    btn.selected = YES;
    _selBtn = btn;
}
  • 當(dāng)點擊開始選號按鈕時,通過transform獲取選中按鈕的旋轉(zhuǎn)角度亿蒸,并進(jìn)行逆向旋轉(zhuǎn)凑兰,并在動畫結(jié)束以后重新開啟定時器動畫
#pragma mark - 點擊開始選號的時候
- (IBAction)startPicker:(id)sender {
    
    // 不需要定時器旋轉(zhuǎn)
    self.link.paused = YES;
    
    // 中間的轉(zhuǎn)盤快速的旋轉(zhuǎn)掌桩,并且不需要與用戶交互
    
    CABasicAnimation *anim = [CABasicAnimation animation];
    
    anim.keyPath = @"transform.rotation";
    
    anim.toValue = @(M_PI * 2 * 3);
    
    anim.duration = 0.5;
    anim.delegate = self;
    
    [_centerView.layer addAnimation:anim forKey:nil];
    
    // 點擊哪個星座,就把當(dāng)前星座指向中心點上面
    
    // M_PI 3.14
    // 根據(jù)選中的按鈕獲取旋轉(zhuǎn)的度數(shù),
    // 通過transform獲取角度
    CGFloat angle = atan2(_selBtn.transform.b, _selBtn.transform.a);
    
    // 旋轉(zhuǎn)轉(zhuǎn)盤
    _centerView.transform = CGAffineTransformMakeRotation(-angle);
    
}

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        
        self.link.paused = NO;
    });
}

折疊圖片的動畫

  • 原理分析:通過兩個UIImageView分別顯示圖片的上半部分(topView)和下半部分(bottonView)票摇,然后將其放入同一個UIView(dragView)拘鞋,旋轉(zhuǎn)的時候只旋轉(zhuǎn)上部分的控件,為了讓一張完整的圖片通過兩個控件顯示矢门,可以通過layer圖層控制圖片顯示的內(nèi)容

  • 如何快速的把兩個控件拼接成一個完整的圖片

    • 可以通過contentsRect設(shè)置圖片顯示的尺寸盆色,取值0~1
    _topView.layer.contentsRect = CGRectMake(0, 0, 1, 0.5);
    _topView.layer.anchorPoint = CGPointMake(0.5, 1);
    
    _bottomView.layer.contentsRect = CGRectMake(0, 0.5, 1, 0.5);
    _bottomView.layer.anchorPoint = CGPointMake(0.5, 0);
  • 分別給dragView添加拖拽手勢(UIPanGestureRecognizer)和bottonView添加漸變圖層(CAGradientLayer)
    // 添加手勢
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
    
    [_dragView addGestureRecognizer:pan];
    
    // 漸變圖層
    CAGradientLayer *gradientL = [CAGradientLayer layer];
    
    // 注意圖層需要設(shè)置尺寸
    gradientL.frame = _bottomView.bounds;

    gradientL.opacity = 0;
    gradientL.colors = @[(id)[UIColor clearColor].CGColor,(id)[UIColor blackColor].CGColor];
    _gradientL = gradientL;
    // 設(shè)置漸變顏色
    // gradientL.colors = @[(id)[UIColor redColor].CGColor,(id)[UIColor greenColor].CGColor,(id)[UIColor yellowColor].CGColor];
    
    // 設(shè)置漸變定位點
    // gradientL.locations = @[@0.1,@0.4,@0.5];
    
    // 設(shè)置漸變開始點,取值0~1
    // gradientL.startPoint = CGPointMake(0, 1);
    
    [_bottomView.layer addSublayer:gradientL];
  • 在拖拽手勢的pan方法中給topView的layer圖層添加旋轉(zhuǎn)動畫以及設(shè)置漸變圖層的陰影效果祟剔,并在手指抬起的時候添加彈簧效果的動畫
// 拖動的時候旋轉(zhuǎn)上部分內(nèi)容隔躲,200 M_PI
- (void)pan:(UIPanGestureRecognizer *)pan
{
    // 獲取偏移量
   CGPoint transP = [pan translationInView:_dragView];
    
    // 旋轉(zhuǎn)角度,往下逆時針旋轉(zhuǎn)
    CGFloat angle = -transP.y / 200.0 * M_PI;
    
    CATransform3D transfrom = CATransform3DIdentity;
    
    // 增加旋轉(zhuǎn)的立體感,近大遠(yuǎn)小,d:距離圖層的距離
    transfrom.m34 = -1 / 500.0;
    
    transfrom = CATransform3DRotate(transfrom, angle, 1, 0, 0);
    
    _topView.layer.transform = transfrom;
    
    // 設(shè)置陰影效果
    _gradientL.opacity = transP.y * 1 / 200.0;
    
    if (pan.state == UIGestureRecognizerStateEnded) { // 反彈
        
        // 彈簧效果的動畫
        // SpringWithDamping:彈性系數(shù),越小物延,彈簧效果越明顯
        [UIView animateWithDuration:0.6 delay:0 usingSpringWithDamping:0.2 initialSpringVelocity:10 options:UIViewAnimationOptionCurveEaseInOut animations:^{
            
            _topView.layer.transform = CATransform3DIdentity;
            
        } completion:^(BOOL finished) {
            
        }];
    }
    
}

音量震動條的動畫

  • 核心:復(fù)制圖層CAReplicatorLayer的使用

  • 復(fù)制圖層:是指可以把圖層里面的所有子層復(fù)制

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    // CAReplicatorLayer復(fù)制圖層兴泥,可以把圖層里面所有子層復(fù)制
    // 創(chuàng)建復(fù)制圖層
    CAReplicatorLayer *repL = [CAReplicatorLayer layer];
    
    repL.frame = _lightView.bounds;
    
    [_lightView.layer addSublayer:repL];
    
    CALayer *layer = [CALayer layer];
    
    layer.anchorPoint = CGPointMake(0.5, 1);
    layer.position = CGPointMake(15, _lightView.bounds.size.height);
    layer.bounds = CGRectMake(0, 0, 30, 150);
    
    layer.backgroundColor = [UIColor whiteColor].CGColor;
    
    [repL addSublayer:layer];
    
    CABasicAnimation *anim = [CABasicAnimation animation];
    
    anim.keyPath = @"transform.scale.y";
    
    anim.toValue = @0.1;
    
    anim.duration = 0.5;
    
    anim.repeatCount = MAXFLOAT;
    
    // 設(shè)置動畫反轉(zhuǎn)
    anim.autoreverses = YES;
    
    [layer addAnimation:anim forKey:nil];
    
    // 復(fù)制層中子層總數(shù)
    // instanceCount:表示復(fù)制層里面有多少個子層臣缀,包括原始層
    repL.instanceCount = 3;
    
    // 設(shè)置復(fù)制子層偏移量,不包括原始層,相對于原始層x偏移
    repL.instanceTransform = CATransform3DMakeTranslation(45, 0, 0);
    
    // 設(shè)置復(fù)制層動畫延遲時間
    repL.instanceDelay = 0.1;
    
    // 如果設(shè)置了原始層背景色,就不需要設(shè)置這個屬性
    repL.instanceColor = [UIColor greenColor].CGColor;
    
    repL.instanceGreenOffset = -0.3;
    
}

活動指示器動畫

  • 同樣是利用復(fù)制層制作類似進(jìn)度條的動畫
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    CAReplicatorLayer *repL = [CAReplicatorLayer layer];
    
    repL.frame = _redView.bounds;
    
    [_redView.layer addSublayer:repL];
    
    CALayer *layer = [CALayer layer];
    
    layer.transform = CATransform3DMakeScale(0, 0, 0);
    
    layer.position = CGPointMake(_redView.bounds.size.width / 2, 20);
    
    layer.bounds = CGRectMake(0, 0, 10, 10);
    
    layer.backgroundColor = [UIColor greenColor].CGColor;
    
    [repL addSublayer:layer];
    
    // 設(shè)置縮放動畫
    CABasicAnimation *anim = [CABasicAnimation animation];
    
    anim.keyPath = @"transform.scale";
    
    anim.fromValue = @1;
    
    anim.toValue = @0;
    
    anim.repeatCount = MAXFLOAT;
    
    CGFloat duration = 1;
    
    anim.duration = duration;
    
    [layer addAnimation:anim forKey:nil];

    int count = 20;
    
    CGFloat angle = M_PI * 2 / count;
    
    // 設(shè)置子層總數(shù)
    repL.instanceCount = count;
    
    repL.instanceTransform = CATransform3DMakeRotation(angle, 0, 0, 1);
    
    repL.instanceDelay = duration / count;
    
}

單條路徑粒子效果動畫

  • 原理分析:在touchesBegan方法中創(chuàng)建UIBezierPath并設(shè)置起點扼脐,在touchesMoved方法添加線到某點,在awakeFromNib方法中初始化復(fù)制層和單個粒子的圖層痴鳄,當(dāng)用戶點擊開始動畫按鈕柏卤,給單個粒子設(shè)置幀動畫,并設(shè)置粒子的數(shù)量以及延遲動畫的時間

  • 當(dāng)手指觸摸開始的時候

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    
    // 重繪
    [self reDraw];
    
    // 獲取touch對象
    UITouch *touch = [touches anyObject];
    
    // 獲取當(dāng)前觸摸點
    CGPoint curP = [touch locationInView:self];
    
    // 創(chuàng)建一個路徑
    UIBezierPath *path = [UIBezierPath bezierPath];

    // 設(shè)置起點
    [path moveToPoint:curP];
    
    _path = path;
    
}
  • 在手指移動過程中時刻添加連線并進(jìn)行重繪
static int _instansCount = 0;

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    // 獲取touch對象
    UITouch *touch = [touches anyObject];
    
    // 獲取當(dāng)前觸摸點
    CGPoint curP = [touch locationInView:self];

    // 添加線到某個點
    [_path addLineToPoint:curP];
    
    // 重繪
    [self setNeedsDisplay];
    
    _instansCount ++;
    
}

- (void)drawRect:(CGRect)rect {
    [_path stroke];
}
  • 在awakeFromNib方法中初始化圖層
- (void)awakeFromNib
{
    // 創(chuàng)建復(fù)制層
    CAReplicatorLayer *repL = [CAReplicatorLayer layer];
    
    repL.frame = self.bounds;
    
    [self.layer addSublayer:repL];
    
    // 創(chuàng)建圖層
    CALayer *layer = [CALayer layer];
    
    CGFloat wh = 10;
    layer.frame = CGRectMake(0, -1000, wh, wh);
    
    layer.cornerRadius = wh / 2;
    
    layer.backgroundColor = [UIColor blueColor].CGColor;
    
    [repL addSublayer:layer];
    
    _dotLayer = layer;
    
    _repL = repL;
}

#pragma mark - 開始動畫
- (void)startAnim
{

    _dotLayer.hidden = NO;
    
    // 創(chuàng)建幀動畫
    CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];
    
    anim.keyPath = @"position";
    
    anim.path = _path.CGPath;
    
    anim.duration = 4;
    
    anim.repeatCount = MAXFLOAT;
    
    [_dotLayer addAnimation:anim forKey:nil];
    
    // 復(fù)制子層
    _repL.instanceCount = _instansCount;
    
    _repL.instanceDelay = 0.1;
    
}

- (void)reDraw
{
    
    _path = nil;
    [self setNeedsDisplay];
    
    _dotLayer.hidden = YES;
    
}

多條路徑粒子效果動畫

  • 原理分析:通過懶加載dotLayer和path抖拴,可以保證在程序運行過程中只有一個dotLayer和path對象

  • 懶加載dotLayer和path燎字,需重寫其get方法

#pragma mark - 懶加載點層
- (CALayer *)dotLayer
{
    if (_dotLayer == nil) {
        // 創(chuàng)建圖層
        CALayer *layer = [CALayer layer];
        
        CGFloat wh = 10;
        layer.frame = CGRectMake(0, -1000, wh, wh);
        
        layer.cornerRadius = wh / 2;
        
        layer.backgroundColor = [UIColor blueColor].CGColor;
        [_repL addSublayer:layer];
        
        _dotLayer = layer;
    }
    return _dotLayer;
}

- (UIBezierPath *)path
{
    if (_path == nil) {
        _path = [UIBezierPath bezierPath];
    }
    
    return _path;
}
  • 注意:如果復(fù)制的子層有動畫,需要先添加動畫再復(fù)制阿宅,否則子層動畫可能添加不成功

  • 復(fù)制子層:self.repL.instanceCount = self.instanceCount;

  • 延遲圖層動畫:self.repL.instanceDelay = 0.2;

倒影效果

  • 利用復(fù)制層候衍,將圖片繞X軸旋轉(zhuǎn)后修改圖層顏色通道的值
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    CAReplicatorLayer *layer =  (CAReplicatorLayer *)_repView.layer;
    
    layer.instanceCount = 2;
    
    CATransform3D transform = CATransform3DMakeTranslation(0, _repView.bounds.size.height, 0);
    // 繞著X軸旋轉(zhuǎn)
    transform = CATransform3DRotate(transform, M_PI, 1, 0, 0);
    
    // 往下面平移控件的高度
    layer.instanceTransform = transform;
    
    layer.instanceAlphaOffset = -0.1;
    layer.instanceBlueOffset = -0.1;
    layer.instanceGreenOffset = -0.1;
    layer.instanceRedOffset = -0.1;

}

QQ粘性效果

  • 注意:touchesBegan方法會和按鈕的監(jiān)聽事件沖突,所以在有按鈕的監(jiān)聽事件以后洒放,只能使用手勢事件代替touchesBegan方法

  • 使用self.transform修改按鈕的形變蛉鹿,并不會修改按鈕的中心點,所以需要直接修改self.center

  • 每一次相對于上一次的形變往湿,都需要進(jìn)行復(fù)位操作

  • 繪制不規(guī)則的矩形榨为,不能通過繪圖,因為繪圖只能在當(dāng)前控件上畫煌茴,超出部分將不會顯示随闺,而且只有當(dāng)兩個圓產(chǎn)生距離的時候才需要進(jìn)行繪制

  • 描述兩圓之間的矩形路徑需要特定的算法

  • 手指抬起的時候,將大圓進(jìn)行還原蔓腐,根據(jù)圓心的距離判斷是否需要移除不規(guī)則矩形

    • 當(dāng)大小圓圓心的距離大于設(shè)定的最大圓心距離時矩乐,需要展示一張爆炸的gif圖片,并將大圓從父控件中移除
    • 當(dāng)圓心距離不大于規(guī)定的距離時,需要移除不規(guī)則矩形散罕,并將大圓還原到默認(rèn)的位置
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末分歇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子欧漱,更是在濱河造成了極大的恐慌职抡,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件误甚,死亡現(xiàn)場離奇詭異缚甩,居然都是意外死亡,警方通過查閱死者的電腦和手機窑邦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門擅威,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冈钦,你說我怎么就攤上這事郊丛。” “怎么了瞧筛?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵厉熟,是天一觀的道長。 經(jīng)常有香客問我较幌,道長揍瑟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任绅络,我火速辦了婚禮,結(jié)果婚禮上嘁字,老公的妹妹穿的比我還像新娘恩急。我一直安慰自己,他們只是感情好纪蜒,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布衷恭。 她就那樣靜靜地躺著,像睡著了一般纯续。 火紅的嫁衣襯著肌膚如雪随珠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天猬错,我揣著相機與錄音窗看,去河邊找鬼。 笑死倦炒,一個胖子當(dāng)著我的面吹牛显沈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼拉讯,長吁一口氣:“原來是場噩夢啊……” “哼涤浇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起魔慷,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤只锭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后院尔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜻展,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年召边,在試婚紗的時候發(fā)現(xiàn)自己被綠了铺呵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡隧熙,死狀恐怖片挂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贞盯,我是刑警寧澤音念,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站躏敢,受9級特大地震影響闷愤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜件余,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一讥脐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧啼器,春花似錦旬渠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至损谦,卻和暖如春岖免,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背照捡。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工颅湘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人栗精。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓栅炒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子赢赊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Core Animation Core Animation乙漓,中文翻譯為核心動畫,它是一組非常強大的動畫處理API释移,...
    45b645c5912e閱讀 3,016評論 0 21
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,744評論 25 707
  • 官網(wǎng)中文版 1 簡易天空替換## 技能:線性擦除叭披,追蹤運動,用顏色鍵K出人物玩讳,用色彩曲線調(diào)色涩蜘。(1)天空圖片素材放...
    朱細(xì)細(xì)閱讀 10,675評論 4 82
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件熏纯、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,059評論 4 62
  • 初戀的感覺你還記得嗎同诫? 你的初戀現(xiàn)在在哪里? -1- 他出現(xiàn)在我的世界里是在讀小學(xué)的時候樟澜。 那個時候的我误窖,心智還是...
    周小墨er閱讀 364評論 0 2