Android 贝塞尔曲线的魅力

Android-高级-UI-进阶之路-(七)-SVG-基础使用-+-绘制中国地图 它定义的图像如下所示: 上面水滴形状就是呈现出来的对应的图像,在这段代码中,首先使用 vector 标签来指定这是一幅 SVG 图像,而它有下面几个属性。 width/height : 表示该 SVG 宽高 viewportHeight/viewportWidth: 表示 SVG 图形划分的比例 path 标签 常用属性 标签名称 说明 android:name 声明一个标记,类似于 ID ,便于对其做动画的时候顺利地找到该节点 android:pathData 对 SV... 阅读详情

前几天在手机优快云客户端看到一个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水滴效果指示器开源项目实战Demo

在Android开发中,自定义View是实现高度定制化UI的核心手段之一。本章将深入剖析自定义View的绘制流程,重点围绕onDraw()方法的工作机制展开讲解。从View的测量(measure)、布局(layout)到绘制(draw)三大流程切入,解析CanvasPaint和Path等核心类在绘图过程中的角色定位:@Override// 抗锯齿// 绘制圆形水滴雏形通过理解触发重绘、引发重新布局的条件,掌握界面更新的时机与性能影响。同时,介绍如何在。

weixin_30923011的博客 362

Android 仿蚂蚁森林水滴动效

Android "巧"仿蚂蚁森林水滴动效

QG 464

Android——实现光点模糊渐变的自旋转圆环特效,实现水滴波纹特效源码

Android——实现光点模糊渐变的自旋转圆环特效,实现水滴波纹特效的源代码。 博客地址:http://blog.youkuaiyun.com/qq_22770457?viewmode=contents

android 水滴动画效果图,Android控件实现水滴效果

看到ios版上QQ刷新效果像水滴,然后自己也想着去实现这样的效果,这篇文章暂时没有介绍下拉刷新的效果,只是单独用一个控件来实现这样的水滴效果。效果图如下:一、总体思路1、画两个圆形,其中一个就是上面的大圆,还有一个是下面的小圆,大圆和小圆不断变小,大圆的位置保持不变,小圆的位置不断向下移动,即圆心不断下移。2、画两边的曲线,这时候用到贝塞尔曲线去画。3、用属性动画实现动态的效果。二、代码实现1、找...

weixin_42549117的博客 1038

android 水滴动画版下拉刷新

代码为博客的实例代码,有问题请博客留言:http://blog.youkuaiyun.com/seven2729/article/details/48435523

从零构建2.4G无线通信系统:MSPM0G3507与NRF24L01的深度协同设计

本文详细介绍了基于MSPM0G3507微控制器与NRF24L01射频模块构建2.4G无线通信系统的深度协同设计方案。内容涵盖系统架构、SPI通信优化、功耗管理、抗干扰机制及中断/DMA高效利用,为工业物联网应用提供高可靠、低功耗的无线传输解决方案。

rice5的博客 821

贝塞尔曲线开发的艺术

                     贝塞尔曲线开发的艺术一句话概括贝塞尔曲线:将任意一条曲线转化为精确的数学公式。很多绘图工具中的钢笔工具,就是典型的贝塞尔曲线的应用,这里的一个网站可...

qq_44925210的博客 240

单相PWM整流器四象限运行原理

简述单相PWM整流器四象限运行原理。

m0_75208156的博客 8299

自带美感的贝塞尔曲线原理与实战——Android高级UI

一、前言 贝塞尔曲线,想必大家或多或少都听过这个词,因为其控制简单,且其曲线更符合我们大众的审美,所以在很多领域都有涉及,当然这些都不是我们今天要进行讨论和分享的重点。今天要分享的是: 贝塞尔曲线如何得出; 在canvas中如何绘制多阶贝塞尔曲线(3阶以上); 贝塞尔曲线的使用场景; 二、贝塞尔曲线如何得出 想要讲清楚多阶贝塞尔曲线,我们先要从一阶开始讲起 ...

江澎涌的博客 1122

【论文阅读】AU检测|《Deep Adaptive Attention for Joint Facial Action Unit Detection and Face Alignment》

摘要 本文旨在从大量没有人工标注的视频中学习用于面部动作单元检测的区分表示。受面部动作是面部肌肉运动这一事实的启发,论文将这些运动描述为不同帧中两幅面部图像之间的转换,并将其用作学习表示的自我监控信号。但是,在不受控制的情况下,这种转换是由面部动作和头部运动引起的。为了消除头部运动的影响,我们提出了一个双圈自动编码器(TCAE),它可以解开面部动作相关运动和头部运动相关运动。具体而言,TCAE被训练成分别将源面部的面部动作和头部姿态改变为目标面部的面部动作和头部姿态。我们的实验验证了TCAE解耦运动的能力。

Celine的博客 4554

别再乱点U盘里的.exe了!手把手教你彻底清除那个伪装成Usb Disk的蠕虫病毒

本文详细介绍了如何识别、清除和预防伪装成Usb Disk的蠕虫病毒。从识别感染迹象到安全备份文件,再到深度清理病毒残留和构建防护策略,提供了一套完整的U盘病毒解决方案。特别提醒用户注意U盘病毒的风险,并养成良好的使用习惯。

weixin_30496999的博客 667

Android_实现水滴效果

编写实体类: public class Cricle { float x; float y; int pointIndex; float r=0;//初始半径 int alpha=255;//初始透明度 public Cricle(float x,float y,int pointIndex){ this.x=x;

qq_38377273的博客 1737

别再让步进电机‘发烧’了!用FOC闭环驱动实现精准力矩控制(基于P0斩波恒流版)

本文详细介绍了如何利用FOC闭环驱动技术(基于P0斩波恒流版)解决步进电机过热和力矩控制不精准的问题。通过对比传统开环控制的缺陷,展示了FOC在降低温度、提升精度和能效方面的显著优势,并提供了硬件配置、软件实现及性能优化的完整方案。

weixin_30872157的博客 567

Android动画探索——图标依次变大的水滴效果

一直打算模仿ios,做一个安卓的水滴效果:比如有四个图标,四个图标依次出现,并由小变大。就像水滴掉落时一头大一头小一样。

WoodyHD的专栏 5502

社交媒体文章内容与评论抓取:Python 爬虫实战教程

通过本文的介绍,我们学习了如何使用 Python 编写爬虫,抓取社交媒体平台的文章内容和评论。我们详细介绍了如何使用requestsSelenium和Tweepy等工具,抓取微博和 Twitter 上的公开数据。同时,我们还讨论了如何处理反爬虫机制,避免账号或 IP 被封禁。抓取社交媒体数据是一个充满挑战和乐趣的过程,掌握这些技术后,你可以在大数据分析、情感分析和舆情监测等方面得到更深层次的应用。

2201_76125261的博客 1710

YOLOv11 改进 - 注意力机制 | 空间增强注意力SEAM(Spatially Enhanced Attention Module)提升遮挡场景检测鲁棒性

本文介绍了分离与增强注意力模块(SEAM)在YOLOv11中的结合应用。SEAM模块旨在增强面部特征学习能力,特别是处理面部遮挡问题。它采用多头注意力机制强调面部区域、抑制背景区域,第一部分使用深度可分离卷积减少参数并学习通道重要性,通过1x1卷积增强通道联系,利用两层全连接网络融合通道信息,经指数归一化后作为注意力权重与原始特征相乘。我们将SEAM集成到YOLOv11的检测头中,并进行相关注册和配置。实验表明,该方法有助于提升模型检测性能。

魔改工程师的博客 1664

android 小水滴变成大江河

一、scrollview 使用了scrollview这么久一直没

小宾 799

Open3D 计算点云的倒角距离(Chamfer Distance)【2025最新版】

;Chamfer Distance距离可以计算生成点云数据与标签点云数据之间的平均最短点距离。Open3D可以直接用来计算点云的Chamfer Distance距离。博客长期更新,本文最近一次更新时间为:2025年2月18日。

点云侠的博客 3254

android+水滴粘性动画,Html5七种不同炫酷的SVG液态水滴融合动画特效

【温馨提示】源码包解压密码:www.youhutong.com部分效果图:部分效果图:描述说明:简要教程这是一组使用HTML5 SVG过滤器制作的炫酷液态水滴融合动画特效。这些SVG动画特效使一些HTML元素,如菜单、分页按钮、APP、选择框等元素的过渡动画像几粒水滴一样融合分解,效果非常的酷。SVG Filters通过SVG Filters我们可以修改一个给定的图形,创建我们需要的结果。SVG中...

weixin_42639633的博客 475

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

android 水纹上涨与水滴滴下效果

这两天项目比较紧,本来打算完成以后再写博客的,今天终于实现了一个炫的功能,怀着激动的心情,趁热打铁,把项目经验记录一下,效果图如下: 对功能的几点说明: 1.圆形边框旋转 2.水纹上涨 3.水滴滴下 4.方向始终朝向重力 先分析一下思路,首先旋转比较好实现,只需要旋转动画就可以了,第二个水纹效果,参考了一篇博客, http://www.jianshu.com/p/e711e22e05

jifashihan的博客 4663

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

android 高仿ios水滴,Android高仿path小球刷新效果,类似IOS果冻效果

前方高能,老司机~一.概述相信用过path app的人都会被其精美的效果给吸引到,作为一名用户,我首先被其吸引都的就是其时间轴下拉刷新后类似于ios的果冻效果。同时作为一名coder,我们更应该好奇它是怎么实现的。于是乎,在百度的指引下,并没有什么斩获,既然如此,那就由我们自己撸出来吧!下面看看我们自己撸出来的效果和path原装效果的区别吧。(注意重点在小球的果冻效果哦O(∩_∩)O)这里写图片描...

weixin_29821699的博客 266

android 点击水滴效果,Android自定义带水滴的进度条样式(带渐变色效果)

一、直接看效果二、直接上代码1.自定义控件部分package com.susan.project.myapplication;import android.app.activity;import android.content.context;import android.graphics.bitmap;import android.graphics.bitmapfactory;import an...

weixin_34340606的博客 297

Android 自定义View之下雨动画

效果 开始前先做个热身( ˘•灬•˘ ) 自己实现比较容易,但是到了要出博客整理思路,总结要点的时候就挠头,不知云所以,所以最简单的还是 Read the fucking source code 如果对安卓UI有兴趣的朋友可以加我好友互相探讨,这里有很多自定义view可以参考 思路 思路比较简单,整个view无非两样东西 云 雨滴 这里又包含两部分动画,一部分是云的左右移动动画,一部分是雨...

weixin_33835690的博客 307

Android自定义控件----WaterFallLayout

之前有看到一个下拉更新是出现的一个水滴下落,然后出现加载条的.具体效果已经不是记得很清楚了,现在凭记忆写了一些出来,目前还只是掩饰阶段,尚未可以用在项目中.大家如果需要的话,可以根据自己的需求去修改.项目依旧放在我的github上:下载地址下面是效果图:

樱落山庄 665

android自定义View贝赛尔曲线

参考:http://blog.youkuaiyun.com/z82367825/article/details/51599245贝赛尔绘制心形http://blog.youkuaiyun.com/u012296503/article/details/51510206 自定义view锯齿样式 效果图 继承view重写onDraw方法用穿过来的canvas画线 public class BezierTestView ex

qq_30707799的博客 332
上一篇: Android-贝塞尔曲线
下一篇: android中的recyclerview的基础学习(一)
Happy_Develop_
博客等级 码龄12年 26粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值