从0到1Android自定义View(四)贝塞尔曲线

Android自定义View(四)Path之贝塞尔曲线 一、概述 1、贝赛尔曲线来源 在数学的数值分析领域中,贝赛尔曲线(Bézier曲线)是电脑图形学中相当重要的参数曲线。更高维度的广泛化贝塞尔曲线就称作贝塞尔曲面,其中贝塞尔三角是一种特殊的实例 贝塞尔曲线于1962年,由法国工程师皮埃尔·贝塞尔(Pierre Bézier)广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计。贝塞尔曲线最初由Paul de Casteljau于1959年运用de ... 阅读详情

Android.jpg

前言

扯来扯去,前面三篇自定义 View 文章,终于扯完了一些知识点,有些枯燥,所以我也是讲下核心点,没有细分析,主要是让各位有点印象和了解。这篇终于是实践,敲代码的了,因为工作原因,这篇拖的比较久,不过这系列会一直更新下去的,会把我工作中用到的自定义 View 也会加上去。好了,回归正原题,说到自定义 View ,似乎都离不开贝塞尔曲线,因此,第一篇实践就是与贝塞尔曲线有关的。

目录

从0到1Android自定义View(四) 贝塞尔曲线.png

一、贝塞尔曲线

1、贝塞尔曲线简介

来看看官方对神奇的赛贝尔曲线的介绍:贝塞尔曲线于 1962,由法国工程师皮埃尔·贝塞尔所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计。贝塞尔曲线最初由 Paul de Casteljau 于 1959 年运用 de Casteljau 演算法开发,以稳定数值的方法求出贝兹曲线。贝塞尔曲线主要用于二维图形应用程序中的数学曲线,曲线由起始点,终止点(也称锚点)和控制点组成,通过调整控制点,贝塞尔曲线的形状会发生变化。

看完后是不是一脸蒙蔽,一句话理解贝塞尔曲线就是:将任意一条曲线转化为精确的数学公式。

2、赛贝尔曲线公式

竟然说了是将曲线转化为精确的数学公式,那么我们来看下具体的数学公式( 注:以下公式中,B(t) 为 t 时间下点的坐标; P0 为起点,Pn 为终点,Pi 为控制点 ):

(1) 一阶贝塞尔曲线(线段)

由 P0 至 P1 的连续点, 描述的一条线段

一阶贝塞尔曲线公式.jpg

一阶贝塞尔曲线公式图.jpg

(2) 二阶贝塞尔曲线(抛物线):

由 P0 至 P1 的连续点 Q0,描述一条线段。

由 P1 至 P2 的连续点 Q1,描述一条线段。

由 Q0 至 Q1 的连续点 B(t),描述一条二次贝塞尔曲线。

二阶贝塞尔曲线(抛物线)公式.jpg

二阶贝塞尔曲线(抛物线)公式图.jpg

(3) 三阶贝塞尔曲线:

三阶贝塞尔曲线公式.jpg

三阶贝塞尔曲线公式图.jpg

3、贝塞尔曲线在 Android 中的应用

其实贝塞尔曲线在 Android 自定义 View 中运用还是挺多的,比如

  • Android 5.0 后下拉刷新的阴影曲线
  • QQ 消息提醒的小红点
  • 用于左右滑动时显示个数的点的移动动画
  • 水流波动效果
  • 一个弹性效果的抽屉菜单

4、Android Path 类中提供贝塞尔曲线的操作方法

在 Android 开发中,要实现贝塞尔曲线其实还是很简单的,因为 Android 已经给我们提供了相关接口,此接口方法在 Path 类中,而关于 Path 类的讲解,前面一篇博客就介绍过了。而且通过 Android 的 API 可以知道,贝塞尔曲线从 API1 就开始支持了。下面就是赛贝尔曲线对应的 API 方法了。

贝塞尔曲线对应的方法演示动画
一阶曲线
(线性曲线)
lineTo一阶贝塞尔曲线动图.gif
二阶曲线quadTo二阶贝塞尔曲线(抛物线)动图.gif
三阶曲线cubicTo三阶贝塞尔曲线动图.gif
四阶曲线无四阶贝塞尔曲线动图.gif

5、通过 de Casteljau 算法绘制贝塞尔曲线

上面提过,Path 类中提供了画一到三阶的贝塞尔曲线的方法,如果我们需要绘制更高阶的贝塞尔曲线呢?我们可以采用德卡斯特里奥算法(De Casteljau’s Algorithm)来实现贝塞尔曲线。

效果图:

贝塞尔曲线截屏1.gif

贝塞尔曲线截屏2.gif

贝塞尔曲线截屏3.gif

贝塞尔曲线截屏4.gif

Github 上的代码:beziercurve

里面主要就一个类,beziercurve ,这是个自定义 View ,BezierCurve 里面主要提供了以下的方法:

Methods:
method 方法description 描述
void start()开始贝塞尔曲线(required)
void stop()停止贝塞尔曲线(optional)
boolean addPoint()增加控制点(optional)
boolean delPoint()删除控制点(optional)
int getOrder()获取贝塞尔曲线阶数(optional)
void setRate(int rate)设置移动速率(optional)
void setTangent(boolean tangent)设置是否显示切线(optional)
void setLoop(boolean loop)设置是否循环(optional)
void setOrder(int order)设置贝塞尔曲线阶数(optional)

最后通过 BezierCurveActivity 来展示。

二、贝塞尔曲线的应用

1.QQ 消息提醒可拖拽红点

Github 上的项目地址:qqmsgnotify

效果图:

QQ消息提醒红点.gif

主要是在绘制红点的时候运用了贝塞尔曲线,在固定的位置中,拖拽的时候,有一种粘性的效果,就是这里运用了贝塞尔曲线。

QQ消息提醒红点.png

运用:

(1) 在对应的位置创建一个 TextView
(2) 设置 GooViewListener 监听事件就可以了


 mTvPoint = (TextView) findViewById(R.id.point_conversation);
        mTvPoint.setText("10");
        mTvPoint.setTag(10);
        GooViewListener listener = new GooViewListener(this, mTvPoint) {
            @Override
            public void onDisappear(PointF mDragCenter) {
                super.onDisappear(mDragCenter);
                Toast.makeText(QQMsgNotifyActivity.this, "消失了", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onReset(boolean isOutOfRange) {
                super.onReset(isOutOfRange);
                Toast.makeText(QQMsgNotifyActivity.this, "重置了", Toast.LENGTH_SHORT).show();
            }
        };
        mTvPoint.setOnTouchListener(listener);

2.Viewpage页面引导切换动画

Github 上的项目地址:guideview

效果图:

[ViewPage引导动画.gif](ViewPage引导动画.gif)

其实这个例子也是,运用贝塞尔曲线也就是在绘制那个圆形的地方而已,其他地方基本不怎么使用贝塞尔曲线。

Android进阶之自定义View实战(三)贝塞尔曲线应用 Android进阶之自定义View实战(三)贝塞尔曲线应用一、引言在自定义View中,常常看到这样一些非常规的UI效果,如水滴、心型、水波、仿真书页翻动、弹射床等效果,这里面都包含一个重要的要素:贝塞尔曲线(Bézier curve)。 贝塞尔曲线依据n(n>=3)个点位置任意的点坐标绘制出的一条光滑曲线。贝塞尔曲线的有趣之处更在于它的“皮筋效应”。常用的有二阶和三阶曲线。下面分别是二阶和三阶曲线 阅读详情

相关推荐

浅谈贝塞尔曲线

浅谈贝塞尔曲线 前段时间做了一个手写板功能的东西,其中手写部分用二次贝塞尔曲线完成,今天就来总结一下贝塞尔曲线在Android中的应用,先简单介绍各阶贝塞尔曲线的原理,然后实现通过贝塞尔曲线实现波浪线功能,感兴趣的同学继续看下去吧! 概念 在数学的数值分析领域中,贝塞尔曲线(英语:Bézier curve,亦作“贝塞尔”)是计算机图形学中相当重要的参数曲线。更高维度的广泛化贝塞尔曲线就称作贝兹曲面...

子墨博客 4041

android 底部和导航栏重合_Android实现仿美团底部导航动画

效果展示实现原理这个效果主要是运用了贝塞尔曲线、自定义ViewGroup以及动画的知识。1.贝塞尔曲线(用于实现顺畅的圆弧)一个自定义的ViewGroup中总共使用了三段贝塞尔曲线:而要做到三段贝塞尔曲线完美对接,则需要使第一段贝塞尔曲线的控制点与第二段贝塞尔曲线的起始点和控制点,三点在一条直线上,因此B点需要随着C点的升高。(如下图所示)2.自定义ViewGroup这里为了简单我是直接...

weixin_39610594的博客 769

自定义view进阶-贝塞尔曲线实现水波动画、粘性控件

自定义控件里比较逼格高的,莫属贝塞尔曲线做出的特效了,例如最常见的QQ粘性气泡,以及水波加载动画,反弹的小球

黄勇的博客 1331

从 0 到 1Android 自定义 View(四)贝塞尔曲线

Android.jpg 前言 扯来扯去,前面三篇自定义 View 文章,终于扯完了一些知识点,有些枯燥,所以我也是讲下核心点,没有细分析,主要是让各位有点印象和了解。这篇终于是实践,敲代码的了,因为工作原因,这篇拖的比较久,不过这系列会一直更新下去的,会把我工作中用到的自定义 View 也会加上去。好了,回归正原题,说到自定义 View ,似乎都离不开贝塞尔曲线,因此,第一篇实践就是与贝塞尔曲线...

weixin_34248849的博客 281

Fragment+Viewpager+中间突出的底部导航栏

Fragment+Viewpager+中间突出的底部导航栏 实现点击底部导航Tab切换一级fragment 一级fragment中嵌套viewpager滑动切换二级fragment并同时实现与上部title相应点击事件及底部横线切换的关联

Android选中突出背景效果的底部导航栏功能

今天在群里看到一个底部导航选中突出效果像这样 就想着 这个应该怎么做呢,我记得类似咸鱼那种的是中间突出,不像这种 是选中哪个,哪个就突出 第一种方法 简单快捷,让UI帮忙切几张带突出背景的图片, 选中切换图片简单粗暴 在群里找小伙伴要了UI的切图一看给的6张图片一样大小,也不带突出背景 于是想着有没有第二种方法实现 百度了许久也许是我找的方法不对,也许是大家都没遇到这样的UI。 怎么办,自己想想,静下心来看UI效果,发现突出的地方有点像贝塞尔曲线 再细细分析一下,如果突出的是贝塞尔曲线那么如何画出一条直线,固定的位置突出呢 贝塞尔曲线是Path 里面的api,而Path 是可以连续画线的,

android底部导航栏点击凸起,Android选中突出背景效果的底部导航栏功能

今天在群里看到一个底部导航选中突出效果像这样就想着 这个应该怎么做呢,我记得类似咸鱼那种的是中间突出,不像这种 是选中哪个,哪个就突出第一种方法简单快捷,让UI帮忙切几张带突出背景的图片,选中切换图片简单粗暴在群里找小伙伴要了UI的切图一看给的6张图片一样大小,也不带突出背景于是想着有没有第二种方法实现百度了许久也许是我找的方法不对,也许是大家都没遇到这样的UI。怎么办,自己想想,静下心来看UI效...

weixin_29525745的博客 1960

Android实现美团外卖底部导航栏动画

体验了一下美团外卖的底部导航栏,感觉动画很流畅,分割线被顶起,还有图标的动画,可能用的lottie,觉得分割线被顶起可以自己写动画,所以试着写了一下 。 想自定义view点击实现动画效果,自定义view的区域一定比背景需要被顶起的线要高,所以布局如下: 开始绘制view,被顶起的曲线分三段,前后两端曲线对称的,用path绘制曲线,中间段绘制贝塞尔曲线。 那么我们分别绘制三段曲线,用ValueAnimator实现效果, private void initAnim() { value = startValue; animator = ValueAnimator.ofInt(star

android底部导航,中间凸起底部导航

最近在做一个项目,底部导航中间部分需要凸起,本来一开始我是用一个圆形的背景的但是这样子边上就会有很生硬的边角. 比如就像这样: 这样子就很不美观,于是就用贝斯尔曲线重新绘制一个带有弧形的 首先我们是要知道贝塞尔曲线是怎么绘制的,这里的话我们是用到了二阶的贝塞尔曲线,由二阶贝赛尔公式:B(t)=(1 - t)²Po + 2t(1 - t)P1 + t²P2,t∈[0,1]; 在这里Po是起点,P2是终点,P1是控制点,我们给公式做一个分解因式的转换 B(t)= (1-t)...

weixin_47884471的博客 5989

基于ADS1299的8通道脑电采集系统硬件设计实战

生物电信号采集是医疗电子与可穿戴设备中的关键环节,微弱信号的高保真放大与数字化处理直接影响系统性能。高精度模数转换器与低噪声模拟前端设计成为工程实践的核心。ADS1299作为专用生物电测量芯片,集成多通道低噪声放大器与24位Δ-Σ ADC,广泛应用于脑电、心电等生理信号检测。本文基于ADS1299构建8通道脑电采集系统,详细阐述硬件架构、电源与参考设计、输入保护、PCB布局布线、固件SPI配置及数据读取,并结合实测数据分享噪声抑制与调试经验,为EEG采集设备开发提供完整参考。

weixin_29169505的博客 224

LabVIEW多设备采集实战:1个程序同时控制3个RS485 Modbus仪表

本文详细介绍了如何使用LabVIEW实现多设备RS485 Modbus同步采集,涵盖硬件架构设计、多线程通信框架搭建、数据帧解析技巧及性能优化策略。通过实际项目案例,展示如何解决端口冲突、数据解析错误等工业自动化常见问题,提升采集系统实时性与可靠性。

qsc901234的博客 298

Android学习之BottomNavigationBar实现Android特色底部导航栏

Android底部导航栏的实现方式特别多,例如TabHost,TabLayout,或者TextView等,都可以实现底部导航栏的效果,但是却没有Google官方统一的导航栏样式,今天讲的就是Google最近添加到Material design中的底部导航栏BottomNavigationBar,也可以说是现今Android底部导航栏的一个标准与统一吧。 效果: 实现效果:

pjh的博客 4304

储能逆变器动态无功补偿:从原理到算法实现

本文深入解析了储能逆变器动态无功补偿的核心原理与算法实现。通过四象限运行与解耦控制技术,储能逆变器可在充放电的同时,快速、精准地调节无功功率,有效提升电网电能质量与功率因数。文章详细阐述了从相位调节、容量限制到PI控制算法的完整技术路径,并结合工程实践,探讨了其在光伏/储能系统中的协同控制策略与进阶应用价值。

weixin_29216353的博客 207

android开发自定义view倍丝曲线,从0到1Android自定义View(四)贝塞尔曲线

原标题:从0到1Android自定义View(四)贝塞尔曲线2017年安卓巴士全球开发者论坛-上海站作者本文由两点水投稿,博客地址:http://www.apkbus.com/myspaceblog-911082.html前言扯来扯去,前面三篇自定义 View 文章,终于扯完了一些知识点,有些枯燥,所以我也是讲下核心点,没有细分析,主要是让各位有点印象和了解。这篇终于是实践,敲代码的了,因为工作原...

weixin_35143292的博客 279

Calibre LVS效率翻倍秘籍:用Hierarchical Flow处理亿级晶体管设计的5个关键阶段

本文详细解析了如何利用Hierarchical Flow技术提升Calibre LVS在亿级晶体管SoC设计中的验证效率。通过五个关键阶段的分层验证流程,包括顶层抽象验证、模块级独立验证等,可显著降低内存占用40-60%,缩短迭代周期50-70%,特别适用于SMIC等先进工艺节点。文章还分享了算力资源优化、并行化处理等实战技巧,帮助工程师应对大规模芯片验证挑战。

sam99的博客 768

Ubuntu20.04安全重启后WiFi图标消失?MT7922网卡驱动修复全攻略

本文详细解析了Ubuntu20.04安全重启后WiFi图标消失的问题,特别是针对MT7922网卡驱动失效的情况。通过诊断命令和分步解决方案,包括禁用PCIe ASPM、更新无线固件和升级HWE内核,帮助用户快速恢复网络连接。文章还提供了进阶排查技巧和系统优化建议,确保WiFi稳定运行。

weixin_29202687的博客 368

Android自定义View之贝塞尔曲线

目录(注:特别感谢原作者:来自简书的fuck两点水) 从0到1Android自定义View(四) 贝塞尔曲线.png 一、贝塞尔曲线 1、贝塞尔曲线简介 来看看官方对神奇的赛贝尔曲线的介绍:贝塞尔曲线于 1962,由法国工程师皮埃尔·贝塞尔所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计。贝塞尔曲线最初由 Paul de Casteljau 于 1959 年运用 de Caste

luanxuye的博客 828

宇树G1机器人遥控器音频控制实战

本文介绍了宇树G1人形机器人遥控器控制音频播放的核心实现方案。通过DDS消息订阅获取遥控器输入,采用非阻塞的subprocess调用aplay命令控制外接音响设备。系统支持播放、暂停和重播功能,采用50ms轮询间隔实现实时响应。关键点包括遥控器初始化、音频进程管理(Popen)、退出机制。文章还提供了设备配置指南、遥控器按键说明和常见问题解决方案。该方案从复杂音频播放器中提炼出核心控制逻辑,可作为机器人交互开发的参考模板。

m0_47999117的博客 542

Android 自定义贝塞尔曲线工具

通过递归的方法,每一层中绘制当前控制点控制点之间的线段.除了第一层的样式是固定的之外,一定阶数下的辅助线段及控制点都可以被控制是否展示.而当开启无限制模式的时候,当前绘制的贝塞尔曲线的控制点没有上限,但是为了展示的效果当前模式下的辅助线段的样式都是一致的.监测屏幕的点击事件,增加控制点,除此之外,在长时间触摸屏幕后还会开启是否需要移动一定范围内最近的点移动到触碰的位置的监测.并能提供当前点的列表用于贝塞尔曲线绘制层绘制贝塞尔曲线绘制层来绘制贝塞尔曲线.//判断当前触碰的点附近是否有绘制过的点。

2401_89191701的博客 1040

【DaVinci Configurator专题】-2-将CAN 2.0或CANFD Matrix的Arxml/DBC文件导入到CFG

共9页 目录 1 打开DaVinci Configurator,导入Arxml文件 2 解决导入Arxml文件后可能会出现的一些错误 3 验证CFG的配置 4 根据CFG的配置生成代码 5 结尾 <--返回「实战篇」博文-总目录--> <--返回「Autosar从入门到精通-实战篇」专栏主页--> 关键词: Open the Input Files Assistant Complete update process Update ECU configurati

「汽车电子助手」的博客 6125

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android自定义曲线图实战:从贝塞尔曲线到动态数据可视化

本文详细介绍了在Android平台上从零开始实现自定义曲线图的完整过程。通过深入讲解Canvas绘图、Path路径以及贝塞尔曲线的核心原理,并结合动态数据更新与动画技术,帮助开发者掌握构建高性能、可交互的动态数据可视化组件的实战技能。文章还分享了性能优化、手势交互等进阶技巧与常见开发坑点。

rgv234567的博客 646

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

利用贝塞尔曲线画一个爱心

先讲讲这个Demo的来历吧,当时在看安卓自定义View这一部分,突然就萌生了一个人土味的想法,那就是画一个爱心,然后就开始动手查资料,经过大量的数据调换,最后总算画出了一个看着还差不多的爱心。 不得不说,贝塞尔曲线是真的NB 话不多说,先上效果图。 贝塞尔曲线介绍,个人感觉还不错 下面就是代码了,首先是自己自定义的View代码 放在这里 然后是代码,里面有注释,至于为什么会用这个方法,可以自己...

qq_43502743的博客 3899

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android贝塞尔曲线实现Loading效果

在自己开发项目过程中,经常会用到加载框,如:网络请求等待等,这时我们则需要一段时间的等待以保证数据加载完毕,此时加一个等待框则显得非常具有必要性,以提高用户体验性。本文将通过GABottleLoading插件实现水滴飞溅的加载效果,贝塞尔曲线的又一次运用。 一、贝塞尔曲线     贝塞尔曲线,又称贝兹曲线或贝济埃曲线,主要应用于二维图形应用程序的数学曲线。贝塞尔曲线是计算机图形图像造型的基本工

夏天的夏,夏天的天。 6527

Android自定义View,贝塞尔曲线

效果图 效果图中我们实现了一个简单的随手指滑动的二阶贝塞尔曲线,还有一个复杂点的,穿越所有已知点的贝塞尔曲线。学会使用贝塞尔曲线后可以实现例如QQ红点滑动删除啦,360动态球啦,bulabulabula~ 什么是贝塞尔曲线? 贝赛尔曲线(Bézier曲线)是电脑图形学中相当重要的参数曲线。更高维度的广泛化贝塞尔曲线就称作贝塞尔曲面,其中贝塞尔三角是一种特殊的实例。贝塞尔曲线于1962

sinat_31820805的博客 1095

用贝塞尔曲线画画

什么是贝塞尔曲线 一句话解释:它可以将任何平滑曲线转化为精确的数学公式。例如PS中的钢笔工具,它的原理就是二阶贝塞尔曲线。 一阶贝塞尔曲线 一阶贝塞尔曲线描述的是从p0到p1的连续点,是一条直线。公式如下: B(t)=(1−t)p0+tp1,tϵ(0,1)B(t)=(1-t)p_{0}+tp_{1},t\epsilon (0,1)B(t)=(1−t)p0​+tp1​,tϵ(0,1) 写成下面这...

qq_38817183的博客 1605
上一篇: 【微小说】理想
下一篇: Python 代码规范
Two_Water
博客等级 码龄12年 573粉丝 134原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值