用path动画绘制水波纹

用path动画绘制水波纹

 

效果

 

源码

//
//  ViewController.m
//  PathAnimation
//
//  Created by YouXianMing on 15/7/3.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic, strong)  CAShapeLayer   *animationLayer;
@property (nonatomic, strong)  NSTimer        *timer;

@property (nonatomic)          CGPathRef       oldPath;
@property (nonatomic)          CGPathRef       path;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.animationLayer               = [CAShapeLayer layer];
    self.animationLayer.borderWidth   = 0.5f;
    self.animationLayer.frame         = CGRectMake(0, 0, 200, 200);
    self.animationLayer.position      = self.view.center;
    self.animationLayer.path          = [self createPath].CGPath;
    self.animationLayer.fillColor     = [UIColor redColor].CGColor;
    [self.view.layer addSublayer:self.animationLayer];
    _timer = [NSTimer scheduledTimerWithTimeInterval:0.5f target:self selector:@selector(event) userInfo:nil repeats:YES];
}

- (void)event {

    _oldPath = self.animationLayer.path;
    _path    = [self createPath].CGPath;

    CABasicAnimation *basicAnimation   = [CABasicAnimation animationWithKeyPath:@"path"];
    basicAnimation.duration            = 0.5;
    basicAnimation.fromValue           = (__bridge id)(_oldPath);
    basicAnimation.toValue             = (__bridge id)_path;
    self.animationLayer.path           = _path;

    [self.animationLayer addAnimation:basicAnimation forKey:@"animateCirclePath"];
}

- (UIBezierPath *)createPath {

    static int count = 0;

    CGFloat controlPoint1_X = 0;
    CGFloat controlPoint1_Y = 0;
    CGFloat controlPoint2_X = 0;
    CGFloat controlPoint2_Y = 0;

    if (count ++ % 2 == 0) {

        controlPoint1_X = [self randomNum_70_79];
        controlPoint1_Y = [self randomNum_70_79];

        controlPoint2_X = [self randomNum_120_129];
        controlPoint2_Y = [self randomNum_120_129];

    } else {

        controlPoint1_X = [self randomNum_70_79];
        controlPoint1_Y = [self randomNum_120_129];

        controlPoint2_X = [self randomNum_120_129];
        controlPoint2_Y = [self randomNum_70_79];

    }

    // 获取贝塞尔曲线
    UIBezierPath* bezierPath = [UIBezierPath bezierPath];

    // A
    [bezierPath moveToPoint:CGPointMake(0, 100)];

    // B (Curve)
    [bezierPath addCurveToPoint:CGPointMake(200, 100)
                  controlPoint1:CGPointMake(controlPoint1_X, controlPoint1_Y)
                  controlPoint2:CGPointMake(controlPoint2_X, controlPoint2_Y)];

    // C
    [bezierPath addLineToPoint:CGPointMake(200, 200)];

    // D
    [bezierPath addLineToPoint:CGPointMake(0, 200)];

    // 闭合曲线
    [bezierPath closePath];

    return bezierPath;
}

/**
 *  随机数 70 - 79
 *
 *  @return 随机数
 */
- (CGFloat)randomNum_70_79 {

    return (CGFloat)(arc4random() % 10 + 70);
}

/**
 *  随机数 120 - 129
 *
 *  @return 随机数
 */
- (CGFloat)randomNum_120_129 {

    return (CGFloat)(arc4random() % 10 + 120);
}

@end

核心

时间: 2024-11-03 14:53:53

用path动画绘制水波纹的相关文章

动画绘制水波纹

动画绘制水波纹 使用drawRect:方式绘制的动画效果,右图为占用了多少CPU. 虽然画起来挺好看的,但占用的内存真心吃不消,原因其实很简单哦,drawRect:方法只调用CPU进行图形绘制,所以非常非常的消耗CPU性能,把它集成到应用程序中,我觉得是不靠谱的呢. // // WaterView.h // Cell // // Copyright (c) 2014年 Y.X. All rights reserved. // #import <UIKit/UIKit.h> @interface

Android实现水波纹控件的方法

有很多app使用过水波纹的这样的效果,看着很酷酷的样子,所以自己就撸码写了一个. 实现思路: 利用贝塞尔曲线绘制圆弧(也就是水波的波纹) 通过动画改变绘制的起始点使水波纹平移 首先,定义我们需要的自定义属性. <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="waveStyleable"> <!-- 水波

Android自定义水波纹动画Layout实例代码_Android

话不多说,我们先来看看效果: Hi前辈搜索预览 这一张是<Hi前辈>的搜索预览图,你可以在这里下载这个APP查看更多效果: http://www.wandoujia.com/apps/com.superlity.hiqianbei LSearchView 这是一个MD风格的搜索框,集成了ripple动画以及search时的loading,使用很简单,如果你也需要这样的搜索控件不妨来试试:https://github.com/onlynight/LSearchView RippleEverywh

Android自定义水波纹动画Layout实例代码

话不多说,我们先来看看效果: Hi前辈搜索预览 这一张是<Hi前辈>的搜索预览图,你可以在这里下载这个APP查看更多效果: http://www.wandoujia.com/apps/com.superlity.hiqianbei LSearchView 这是一个MD风格的搜索框,集成了ripple动画以及search时的loading,使用很简单,如果你也需要这样的搜索控件不妨来试试:https://github.com/onlynight/LSearchView RippleEverywh

Android自定义view实现水波纹进度球效果_Android

今天我们要实现的这个view没有太多交互性的view,所以就继承view. 自定义view的套路,套路很深       1.获取我们自定义属性attrs(可省略)       2.重写onMeasure方法,计算控件的宽和高       3.重写onDraw方法,绘制我们的控件 这么看来,自定义view的套路很清晰嘛. 我们看下今天的效果图,其中一个是放慢的效果(时间调的长) 我们按照套路来. 一.自定义属性 <declare-styleable name="WaveProgressVie

Android实现自定义华丽的水波纹效果_Android

先来看看效果 实现效果 模拟水波纹的效果:点击屏幕就有圆环出现,半径从小到大,透明度从大到小(0为透明) 实现思路       1.自定义类继承View.       2.定义每个圆环的实体类 Wave,并初始化绘制圆环的画笔的数据.       3.重写onTouchEvent方法,down时,获得坐标点,做为圆环圆心.       4.发送handler信息,对数据进行修改,刷新页面.       5.重写onDraw方法,绘制一个圆环. 1. 自定义类继承View 新建WaterWaveV

Android仿水波纹流量球进度条控制器_Android

仿水波纹流球进度条控制器,Android实现高端大气的主流特效,供大家参考,具体内容如下 效果图: CircleView 这里主要是实现中心圆以及水波特效 package com.lgl.circleview; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.gra

Android特效专辑(十)——点击水波纹效果实现,逻辑清晰实现简单

Android特效专辑(十)--点击水波纹效果实现,逻辑清晰实现简单 这次做的东西呢,和上篇有点类似,就是用比较简单的逻辑思路去实现一些比较好玩的特效,最近也是比较忙,所以博客更新的速度还得看时间去推演,但是也能保证一周三更的样子,现在也还是以小功能,或者说是一些小入门级别的博客为主,我也不算是什么很厉害的人,很多细节的支持处理的仍然还是不到位,所以也是一直在弥补,话不多说,来看看今天的效果 实现起来很简单吧,那我们就来看一下他是怎么实现的咯! OnclickRuning package com

Android特效专辑(十一)——仿水波纹流量球进度条控制器,实现高端大气的主流特效

Android特效专辑(十一)--仿水波纹流球进度条控制器,实现高端大气的主流特效 今天看到一个效果挺不错的,就模仿了下来,加上了一些自己想要的效果,感觉还不错的样子,所以就分享出来了,话不多说,上图 截图 CircleView 这里主要是实现中心圆以及水波特效 package com.lgl.circleview; import android.content.Context; import android.graphics.Canvas; import android.graphics.Co