前几天在手机CSDN客户端看到一个QQ红点拖拽消失的效果,感觉挺好的,又回想到以前见到的诸如一下效果,感觉挺炫酷的,于是就看了下QQ拖拽的代码,记下笔记。


这个是在泡网上找到
还有一个指示器的效果,那个一时半会找不见了。UC浏览器新闻那一块的下拉刷新也是用了贝塞尔曲线的。

什么是贝塞尔曲线

在数学的数值分析领域中,贝塞尔曲线,
又称贝赛尔曲线(Bézier曲线)是电脑图形学中相当重要的参数曲线。更高维度的广泛化贝塞尔曲线就称作贝塞尔曲面,其中贝塞尔三角是一种特殊的实例。
贝塞尔曲线于1962年,由法国工程师皮埃尔·贝塞尔(Pierre
Bézier)所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计。贝塞尔曲线最初由Paul de Casteljau于1959年运用de
Casteljau算法开发,以稳定数值的方法求出贝塞尔曲线。
贝塞尔曲线在图形学中比较常见,我也是学过图形学的(没学成),贝塞尔曲线画出来的线条让人感觉很优美。

关于贝塞尔曲线的介绍:androidzhaoxiaogang
百度百科

Android中的贝塞尔曲线

Android SDK中为我们实现了二阶和三阶贝塞尔曲线,任意阶的贝塞尔曲线,sdk中并没有提供,不过找了个github的demo7叔。

二阶贝塞尔曲线

Path#quadTo 函数

/*** Add a quadratic bezier from the last point, approaching control point* (x1,y1), and ending at (x2,y2). If no moveTo() call has been made for* this contour, the first point is automatically set to (0,0).** @param x1 The x-coordinate of the control point on a quadratic curve* @param y1 The y-coordinate of the control point on a quadratic curve* @param x2 The x-coordinate of the end point on a quadratic curve* @param y2 The y-coordinate of the end point on a quadratic curve*/public void quadTo(float x1, float y1, float x2, float y2) {isSimplePath = false;native_quadTo(mNativePath, x1, y1, x2, y2);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

4个参数的意思很明白,控制点的xy坐标,终点的xy坐标。


二阶示意图。关于在android中怎么使用就不说了,下面会说三阶的使用方法。

三阶贝塞尔曲线

Path#cubicTo 函数

public void cubicTo(float x1, float y1, float x2, float y2,float x3, float y3) {isSimplePath = false;native_cubicTo(mNativePath, x1, y1, x2, y2, x3, y3);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

参数为第一个控制点的xy,第二个控制点的xy,终点,那么我们来看下如何使用(为了方便,下面使用的时候坐标写死)。

mPaint = new Paint();mPaint.setAntiAlias(true);mPaint.setStyle(Paint.Style.STROKE);mPaint.setStrokeWidth(1);mPaint.setTextSize(25);mPaint.setColor(Color.parseColor("#ee0000"));mPath = new Path();mPath.moveTo(5, 405);mPath.cubicTo(135,5,265,405,405,5);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

哈哈,是不是很简单,只需要将path的起点移动至贝塞尔曲线的起点,然后将坐标套进去,接着在ondraw里面绘制就ok了。 看下这个的效果图。

就是这个效果,看起来很光滑对吧。

QQ红点的实现效果

博客地址找不见了,不过找的见github(前几天fork star啦,在这里对那个作者说声抱歉,没法贴csdn地址了)github地址 。
那么咱们就来看下其中的关键性代码和计算吧。

float offsetX = (float) (radius*Math.sin(Math.atan((y - startY) / (x - startX))));float offsetY = (float) (radius*Math.cos(Math.atan((y - startY) / (x - startX))));float x1 = startX - offsetX;float y1 = startY + offsetY;float x2 = x - offsetX;float y2 = y + offsetY;float x3 = x + offsetX;float y3 = y - offsetY;float x4 = startX + offsetX;float y4 = startY - offsetY;path.reset();path.moveTo(x1, y1);path.quadTo(anchorX, anchorY, x2, y2);path.lineTo(x3, y3);path.quadTo(anchorX, anchorY, x4, y4);path.lineTo(x1, y1);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

上面的代码得配置一张图才好。下面这张图来自QQ地带

。我们需要先确定控制点,控制点的坐标是(手指触点+上开始点)/2.

anchorX =  (event.getX() + startX)/2;
anchorY =  (event.getY() + startY)/2;
  • 1
  • 2
  • 1
  • 2

那么剩下的四个点怎么确定呢。

float offsetX = (float) (radius*Math.sin(Math.atan((y - startY) / (x - startX))));float offsetY = (float) (radius*Math.cos(Math.atan((y - startY) / (x - startX))));
  • 1
  • 2
  • 1
  • 2

上面的2行代码是什么意思呢。就是算出开始点那个圆的半径在X,Y轴上的投影距离。要注意XY轴和屏幕坐标轴的区别,这里算出来的是补角。所以产生了下面的看起来有点怪实际上是正确的代码。上面算出的x是没问题的,但是算出来的y却是-y。

float x1 = startX - offsetX;float y1 = startY + offsetY;float x2 = x - offsetX;float y2 = y + offsetY;float x3 = x + offsetX;float y3 = y - offsetY;float x4 = startX + offsetX;float y4 = startY - offsetY;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

通过上面的代码就把需要的4个点的坐标计算出来了。
接下来说下爆炸的效果。效果很不错是吧,我们常常产生这样的幻觉,当觉得一个效果非常牛非常酷炫的时候,我们通常不会想到帧动画(因为帧动画现在用的比较少了),单却是是那些非常难的动画效果,可以在对性能消耗不大的情况下考虑帧动画。这里也不例外,好了,你们是不是跃跃欲试了么。去github下载代码看看吧。

小水滴的实现效果


,效果不是很好,不过没关系,还是能看的。效果为什么不是很好了,因为我这里不是像上面用的4个点,我这里用的3个点(省事)。看下和上面的那个类似。

float offsetX = (float) (50 * (Math.cos(Math.asin(50/centerY))));float offsetY = (float) (50 * (Math.sin(Math.asin(50/centerY))));mPath.reset();mPath.lineTo(200,0);mPath.quadTo(200,centerY/3,200-offsetX,centerY-offsetY);mPath.lineTo(200+offsetX, centerY-offsetY);mPath.quadTo(200,centerY/3,200,0);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

本来想上张原理图的,但是没找到合适的绘图软件,就算了把。

总结

贝塞尔曲线在android中用起来并不难,但是用在什么地方,什么时候用,却是个很难的为题,就像QQ那个小红点一样,需要创意。

博客中有什么错误的还希望指出来。

Android 贝塞尔曲线的魅力相关推荐

  1. android动态波浪效果,android贝塞尔曲线实现波浪效果

    本文实例为大家分享了android贝塞尔曲线实现波浪效果的具体代码,供大家参考,具体内容如下 因为手机录制gif不知道下什么软件好,所以暂时就先忽略效果图了 我在屏幕外多画了1.5个波浪,延伸至屏幕内 ...

  2. android波浪动画简书,Android贝塞尔曲线————波浪效果(大波浪)

    Hello大家好,很高兴又一次与大家见面,今天是农历丁酉鸡年(大年初四),现在跟大家拜年有点晚,算是拜晚年,祝大家晚年幸福. 这么快大伙都到了晚年了,Android贝塞尔曲线我也准备以一个大波浪来结束 ...

  3. android圆形贝塞尔 菜单,Android 贝塞尔曲线——圆渐变心

    大家好!我是一名执着的Android开发攻城狮,第一次写简书,没有写好的希望大家多多包涵,万事开头难,从去年开始我就想写点自己的东西,但是一直没有写下去的勇气和毅力,希望这是我一个好的习惯开始.在这我 ...

  4. android贝塞尔曲线,一文解析 Android 贝塞尔曲线

    原标题:一文解析 Android 贝塞尔曲线 相信很多同学都知道"贝塞尔曲线"这个词,我们在很多地方都能经常看到.利用"贝塞尔曲线"可以做出很多好看的UI效果, ...

  5. android 贝塞尔曲线点击区域,白话经典贝塞尔曲线及其在 Android 中的应用

    一.前言 谈到贝塞尔曲线可能不少人会浮现它高大上的数学公式.然而,在实际应用中,并不需要我们去完全理解或者推导出公式才能应用得上.实际情况是,即使真的只是一个学渣,我们应该也能很轻松的掌握贝塞尔曲线的 ...

  6. android 贝塞尔曲线_OpenGL 实践之贝塞尔曲线绘制

    说到贝塞尔曲线,大家肯定都不陌生,网上有很多关于介绍和理解贝塞尔曲线的优秀文章和动态图. 以下两个是比较经典的动图了. 二阶贝塞尔曲线: 三阶贝塞尔曲线: 由于在工作中经常要和贝塞尔曲线打交道,所以简 ...

  7. android 贝塞尔曲线 波浪线,Android 贝塞尔曲线实现水纹波动效果

    贝塞尔曲线简介 千篇一律,很多类似的文章都会介绍一下什么是贝塞尔曲线,但是这里就不做介绍了,我们在这里只需要知道在Android API为我们提供了绘制二阶贝塞尔曲线和三阶贝塞尔曲线的方法即可. 效果 ...

  8. Android 贝塞尔曲线实战之网易云音乐鲸云特效,2021程序员进阶宝典

    一阶这个比较简单,因为没有在网上找到可以直接输入数学公式的工具,就手工推导了下. ![在这里插入图片描述](https://img- <Android学习笔记总结+最新移动架构视频+大厂安卓面试 ...

  9. Android 贝塞尔曲线实战之网易云音乐鲸云特效,apm性能监控系统

    小说阅读 APP 的翻页效果. 简介 ===================================================================== 在开始实战之前,我们还 ...

  10. Android 贝塞尔曲线实战之网易云音乐鲸云特效

    作者:哈哈将 -个推 Android 高级开发工程师 前言 APP开发市场已经告别"野蛮生长"时代,人们不再满足于APP外形创新,而将目光转向全方面的用户体验上.在这过程中,动效化 ...

最新文章

  1. 1035 Password
  2. 明日之后怎么跳过实名认证_明日之后新手教程能不能跳过 明日之后新手教程玩法介绍...
  3. XAML 布局StackPanel
  4. pythontemp_python 临时文件夹 的 tempfile模块学习
  5. python打开excel数据库_使用python导入excel文件中的mssql数据库数据
  6. pytorch构造可迭代的DataLoader,动态流式读取数据源,不担心内存炸裂(pytorch Data学习三)
  7. javascript实现下拉条联动_JavaScript gt;gt;gt; 003
  8. java基础:13.1 集合框架 - ArrayList
  9. Python游戏编程_植物大战讲僵尸_贪吃蛇
  10. html怎么设置图片循环播放,gif循环播放怎么设置 怎样让gif图片一直循环播放 gif循环播放...
  11. 高通Android Q(android10)设置默认锁屏壁纸
  12. 澳门大学计算机qs排名,澳门大学世界QS排名
  13. 结构化数据,非结构化数据,半结构化数据的区别
  14. 关于自编码器的核心点理解
  15. python print怎么用_Python学习路线分享Beeprint怎么用
  16. 游戏类型分类-游戏的分类有哪些
  17. 分布式系统-共识协议
  18. IMAX [生活时尚]
  19. c语言零基础入门(完整版)
  20. 如何破解Aspose.word带水印问题

热门文章

  1. DBT-50000及相关问题处理
  2. 刷入twrp_twrp刷入面具进入recovery(twrp)的方式获取root刷入第三方rom获取第三方rom包类原生rom包的网络连接受限问题
  3. 微信云服务器socket,微信小程序使用Socket的实例
  4. 你有多久没有看过星星
  5. 基于微信小程序的小说阅读系统(小程序+Nodejs)
  6. 06-数据类型的常用操作-字符串常用操作
  7. 如何打开高清语音VOLTE
  8. redis安装教程和redis集群搭建--主从复制(读写分离)、中间人模式(主仆兼具、去中心化)、反客为主、哨兵模式,从实战出发的保姆级别教程
  9. 适用于高速公路的查询软件,数据稳定、免维护,可查询高速路况、路线规划、未来天气等信息
  10. 弘辽科技:拼多多top店铺是什么意思?怎么运营?