iOS 水波纹动画的实现效果

本人最近在研究iOS动画,至于原理,我不在这里说了。毕竟这里的标题:水波纹的实现。

在这里,要学习水波纹的实现,首先要知道以下几点知识:

1.正弦函数:y = Asin(wx +b) + c。相信大家都比较熟悉。

2.CAShapeLayer的简单实用,相信看一下,就是知道其大概的用途了,形状Layer层。和用户显示图形的Layer,继承于layer,好了,废话不多说,直接上图吧。

上面的知识点,我会以代码的方式,梳理上面的知识点,不过首先我还是上传效果图吧,有图有真相,才是事实嘛。

1.效果图:

下面开始上代码。

2.创建变量

//这里的lazy:是懒加载 就是OC中重写get,set方法
lazy var waveDisplaylink = CADisplayLink()//相比NSTimer下,这里用CADisplayLink主要是精确点,其频率:1/60
lazy var firstWaveLayer = CAShapeLayer()
lazy var secondWaveLayer = CAShapeLayer()
/// 基础描述 正弦函数
///  y=Asin(ωx+φ)+ b
///  A : wavaA
///  w : 1/waveW
///  φ : offsetφ
///  b : b
private var waveA: CGFloat = 0
private var waveW: CGFloat = 0
private var offsetX: CGFloat = 0
private var b : CGFloat = 0
//水纹的移动的速度
var waveSpeed : CGFloat = 0

上面的变量的,都有相关的注释,我就不再做解释了。

3.数据的初始化

//MARK: - 数据的初始化
private func initData(){
  waveSpeed = 0.05
  waveA = 8
  // 设置周期 :( 2* M_PI)/waveW = bounds.size.width 。因为涉及的是layer,所以只谈bounds,不说frame
  waveW = 2 * CGFloat(M_PI) / bounds.size.width
  b = bounds.size.height / 2
} 

4.UI的初始化

private func configUI(){
   firstWaveLayer.fillColor = UIColor.init(colorLiteralRed: 69/255.0, green: 255/255.0, blue: 255/255.0, alpha: 0.5).cgColor
   secondWaveLayer.fillColor = UIColor.init(colorLiteralRed: 69/255.0, green: 255/255.0, blue: 255/255.0, alpha: 0.5).cgColor
   layer.addSublayer(firstWaveLayer)
   layer.addSublayer(secondWaveLayer)
   waveDisplaylink = CADisplayLink(target: self, selector: #selector(getCurrentWave))
   waveDisplaylink.add(to: RunLoop.current, forMode: .commonModes)
 }

这里创建两个shapeLayer,因为这样的话,可以才像水的波纹不是?,这里还有个要说的是CADisplayLink,主要是他比NSTimer更精准,屏幕刷新频率(FPS)是60,,iOS设备的刷新频率是固定的,正常情况下回再每次刷新结束后都调用,也就是60次/s.所以选择CADisplayLink。

5.下面的关键部分,代码如下:

@objc private func getCurrentWave() {
  offsetX += waveSpeed
  setCurrentStatusWavePath()
}
//MARK: - 关键部分
private func setCurrentStatusWavePath() {
  // 创建一个路径
  let firstPath = CGMutablePath()
  var firstY = bounds.size.width/2
  firstPath.move(to: CGPoint(x: 0, y: firstY))
  for i in 0...Int(bounds.size.width) {
    firstY = waveA * sin(waveW * CGFloat(i) + offsetX) + b
    firstPath.addLine(to: CGPoint(x: CGFloat(i), y: firstY))
  } 

  firstPath.addLine(to: CGPoint(x: bounds.size.width, y: bounds.size.height))
  firstPath.addLine(to: CGPoint(x: 0, y: bounds.size.height))
  firstPath.closeSubpath()
  firstWaveLayer.path = firstPath 

  // 创建一个路径
  let secondPath = CGMutablePath()
  var secondY = bounds.size.width/2
  secondPath.move(to: CGPoint(x: 0, y: secondY)) 

  for i in 0...Int(bounds.size.width) {
    secondY = waveA * sin(waveW * CGFloat(i) + offsetX - bounds.size.width/2 ) + b
    secondPath.addLine(to: CGPoint(x: CGFloat(i), y: secondY))
  }
  secondPath.addLine(to: CGPoint(x: bounds.size.width, y: bounds.size.height))
  secondPath.addLine(to: CGPoint(x: 0, y: bounds.size.height))
  secondPath.closeSubpath()
  secondWaveLayer.path = secondPath
}

这里创建都是通过for循环创建路径,其路径是通过正弦函数,记得不错的话,是在初中的时候学的,哈哈。同时,创建好路径后,要给layer,这样的话,shapeLayer才能知道要绘制什么样的路径和图形。同时这两个要有个角度的差值,这样的话,才能产生相应的效果。

总结:

看到这里同学是不是感觉很简单呀,好了,就说到这里,其下载的地址我这边会稍后上传的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android 自定义view实现水波纹动画效果

    在实际的开发中,很多时候还会遇到相对比较复杂的需求,比如产品妹纸或UI妹纸在哪看了个让人兴奋的效果,兴致高昂的来找你,看了之后目的很明确,当然就是希望你能给她: 在这样的关键时候,身子板就一定得硬了,可千万别说不行,爷们儿怎么能说不行呢: 好了,为了让大家都能给妹纸们想要的,后面会逐渐分享一些比较比较不错的效果,目的只有一个,通过自定义view实现我们所能实现的动效: 今天主要分享水波纹效果: 1.标准正余弦水波纹: 2.非标准圆形液柱水波纹: 虽说都是水波纹,但两者在实现上差异是比较大的,一个

  • Android特效之水波纹的实现

    前言 水波纹特效,想必大家或多或少见过,在我的印象中,大致有如下几种: 支付宝 "咻咻咻" 式 流量球 "荡漾" 式 真实的水波纹效果,基于Bitmap处理式 话不多说,先来看看效果: 填充式水波纹,间距相等 非填充式水波纹,间距相等 非填充式水波纹,间距不断变大 填充式水波纹,间距不断变小 想必大家已经知道基本的原理了,就是用Canvas来画嘛,但可不是简单的画哦,请往下看. 分析 这种类型的水波纹,其实无非就是画圆而已,在给定的矩形中,一个个圆由最小半径扩大到最

  • Android自定义View 实现水波纹动画引导效果

    一.实现效果图 二.实现代码 1.自定义view package com.czhappy.showintroduce.view; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Pat

  • Android自定义View实现水波纹引导动画

    一.实现效果图 关于贝塞尔曲线 二.实现代码 1.自定义view package com.czhappy.showintroduce.view; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.grap

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

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

  • Android实现兼容的水波纹效果

    先看看效果图 其实,要实现这一效果很简单,只要分drawable和drawablev21两个文件夹就好了. 普通情况下的selector: <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@c

  • Android实现水波纹效果

    一.效果 点击开始: 点击停止: 二.在MainActivity中 import android.graphics.Paint; import android.os.Bundle; import android.support.v4.view.animation.LinearOutSlowInInterpolator; import android.support.v7.app.AppCompatActivity; import android.view.View; import 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

  • 基于JS+Canves实现点击按钮水波纹效果

    近来看到个不错的按钮点击效果,当点击时产生一次水波涟漪效果,挺好玩的,于是简单的实现了下(没考虑低版本浏览器兼容问题) 先看看效果吧,如下图(录制gif软件有点渣,看起来卡卡的...) 这种效果可以由元素内嵌套canves实现,也可以由css3实现. Canves实现 网上摘了一份canves实现的代码,略微去掉了些重复定义的样式并且给出js注释,代码如下 html代码 <a class="btn color-1 material-design" data-color="

  • iOS 水波纹动画的实现效果

    本人最近在研究iOS动画,至于原理,我不在这里说了.毕竟这里的标题:水波纹的实现. 在这里,要学习水波纹的实现,首先要知道以下几点知识: 1.正弦函数:y = Asin(wx +b) + c.相信大家都比较熟悉. 2.CAShapeLayer的简单实用,相信看一下,就是知道其大概的用途了,形状Layer层.和用户显示图形的Layer,继承于layer,好了,废话不多说,直接上图吧. 上面的知识点,我会以代码的方式,梳理上面的知识点,不过首先我还是上传效果图吧,有图有真相,才是事实嘛. 1.效果图

  • 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 自定义球型水波纹带圆弧进度效果(实例代码)

    需求 如下,实现一个圆形水波纹,带进度,两层水波纹需要渐变显示,且外围有一个圆弧进度. 思路 外围圆弧进度:可以通过canvas.drawArc()实现.由于圆弧需要实现渐变,可以通过给画笔设置shader(SweepGradient)渲染,为了保证圆弧起始的颜色值始终一致,需要动态调整shader的参数.具体参见 SweepGradient(centerX.toFloat(), centerY.toFloat(), circleColors[0], floatArrayOf(0f, value

  • Android实现水波纹扩散效果的实例代码

    本文讲述了Android实现水波纹扩散效果的实例代码.分享给大家供大家参考,具体如下: 项目地址下载 1.效果图: 2.使用方法: 在xml里使用RippleImageView自定义控件: xmlns:app="http://schemas.android.com/apk/res-auto" <com.army.rippleimage.RippleImageView android:id="@+id/rippleImageView" android:layou

  • flutter InkWell实现水波纹点击效果

    在flutter 开发中用InkWell或者GestureDetector将某个组件包起来,已添加点击事件. GestureDetector 使用点击无水波纹出现,InkWell可以实现水波纹效果. 正常情况下使用 : InkWell( //单击事件响应 onTap: () { }, child: Container( alignment: Alignment(0, 0), height: 28, width: 120, child: Text("InkWell单击事件"), ), )

  • Android实现水波纹控件的方法

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

  • Android实现水波纹特效

    最近需要做个类似于水波纹动画的效果,思考了一下不需要UI切个动态图,Android原生的技术利用动画或者自定义控件都可以实现,下面上个图类似于这样的效果 下面请看第一种动画实现,这种方式较为简单些,就是利用3个ImageView不断地做缩放和渐变的动画. 布局文件定义一下 <RelativeLayout android:id="@+id/rl" android:layout_width="match_parent" android:layout_height=

  • Android自定义水波纹底部导航的实现

    今天给大家带来一个自定义的底部导航,我不会做动图,只能搞一张图片给大家看看,大家见谅 这个就是自定义的tablayout底部搞好的样式了 TabLayout提供了一个水平布局用于展示tabs,继承自HorizontalScrollView.一般与Viewpager结合使用实现页面和标签联动的效果,是时下APP中非常常用的一个控件 首先我们需要创建一个类或者是模块都可以 package com.example.map.tab; import android.content.Context; imp

  • Android自定义View实现水波纹效果

    介绍:水波纹散开效果的控件在 App 里面还是比较常见的,例如 网易云音乐歌曲识别,附近搜索场景. 看下实现的效果: 实现思路: 先将最大圆半径与最小圆半径间距分成几等份,从内到外,Paint 透明度依次递减,绘制出同心圆,然后不断的改变这些同心圆的半径大小,延迟一定时间重绘,便达到了想外散开的动画效果了. public class WaveView extends View { private static final String TAG = "WaveView"; private

随机推荐