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

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

2017年安卓巴士全球开发者论坛-上海站

作者

本文由两点水投稿,博客地址:http://www.apkbus.com/myspaceblog-911082.html

前言

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

目录

d37cd450453d81f36a0d26b9c83f98a7.png

贝塞尔曲线

1、贝塞尔曲线简介

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

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

2、赛贝尔曲线公式

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

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

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

8b413b158eb9a54dd7f64efc9e305f15.png

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

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

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

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

b004c80459a264fba3ee29dc272a9566.png

(3) 三阶贝塞尔曲线:

45a240a032aaaf7b838aaed7d50025bc.png

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

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

Android 5.0 后下拉刷新的阴影曲线

QQ 消息提醒的小红点

用于左右滑动时显示个数的点的移动动画

水流波动效果

一个弹性效果的抽屉菜单

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

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

贝塞尔曲线

对应的方法

演示动画

一阶曲线
(线性曲线)

lineTo

0df5e793b9c02ec98e77bd56370ce456.gif

二阶曲线

quadTo

8a3a4b75df453a49f0564f183a41032c.gif

三阶曲线

cubicTo

b8cdc2e19a5b8fe0ad05988f1bd6806b.gif

四阶曲线

5c926fe25645bc1fa7dc6dd134d48be6.gif

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

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

效果图:

6e12c292d460d320730866cd787d91e3.gif

a56c0927807c5d11e8ef04188ec50286.gif

Github 上的代码:beziercurve

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

Methods:

method 方法

deion 描述

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

效果图:

81f2f8967534afc90f8c7256a9e3b037.gif

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

51f17e66efa331db4b73615bef174949.png

运用:

(1) 在对应的位置创建一个 TextView

(2) 设置 GooViewListener 监听事件就可以了

mTvPoint = (TextView) findViewById(R.id.point_conversation); mTvPoint.setText("10"); mTvPoint.setTag(10); GooViewListener listener = newGooViewListener(this, mTvPoint) {

@Overridepublic void onDisappear(PointF mDragCenter){

super.onDisappear(mDragCenter); Toast.makeText(QQMsgNotifyActivity.this, "消失了", Toast.LENGTH_SHORT).show(); } @Overridepublic void onReset(boolean isOutOfRange){

super.onReset(isOutOfRange); Toast.makeText(QQMsgNotifyActivity.this, "重置了", Toast.LENGTH_SHORT).show(); } }; mTvPoint.setOnTouchListener(listener);2.Viewpage页面引导切换动画

Github 上的项目地址:guideview

效果图:

014876e132e448869e50e92f22f03104.gif

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

大家都在看

欢迎大家到安卓巴士论坛博文》返回搜狐,查看更多

责任编辑:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531861.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何保证对象的唯一性

/* 如何保证对象的唯一性:1.不允许其他程序用new来创建该类对象。2.在该类创建一个本类实例。3.对外提供一个方法让其他程序可以获取该对象的引用。 */ public class Test{public static void main(String[] args){//Subject sub Subject.oSub;//这种方法不可控&am…

ios kvo 要引入_腾讯社招iOS面试记录

毕业好几年了,上周发送了简历给腾讯,参加了腾讯面试。具体部门这边就不说了。这次面试还是收获到了很多。一面电话面试:面试官主要是针对iOS相关的基础问题。先简单自我介绍一下自己对mrc和arc的理解谈谈对自动释放池的理解自动释放池在mrc和…

动态设置html字号,动态设置html的font-size值 (适配文字大小)

PC端(function () {function setRootFontSize() {let rem, rootWidth;let rootHtml document.documentElement;//限制展现页面的最小宽度rootWidth rootHtml.clientWidth < 1366 ? 1366 : rootHtml.clientWidth;// 19.2 设计图尺寸宽 / 100( 设计图的rem 100 )rem roo…

一个小例子对多态简单的理解

class Parent{int age;String name;public Parent(String name, int age){this.name name;this.age age;}public void writeWay(){System.out.println("毛笔!");}}class Child extends Parent{int age;String name;//这里只说为了说明一个问题&#xff0c;其实完全…

运行shell脚本时怎么知道jdk路径_Shell写脚本关于ssh执行jar包,需要刷新JDK路径的问题...

比如脚本中下面这一段ssh $i "java -jar /applog/$PROJECT/$APPNAME --server.port$SERVER_PORT >/dev/null 2>&1 &"免密登录linux服务器&#xff0c;执行jar包&#xff0c;通过ssh执行java程序&#xff0c;涉及到一个找不到JDK路径的问题&#xff0c;…

html 中加号的表示方法,CSS的+(加号)选择器怎么用

在CSS中“”符号选择器用于选择紧跟在指定元素之后但不在特定元素内部的元素。下面本篇文章就来具体介绍一下&#xff0c;希望对大家有所帮助。“”符号选择器在CSS中“”符号选择器被称为相邻兄弟选择器&#xff0c;用于选取在同一父元素下的&#xff0c;紧跟指定元素之后的另…

poj 1724ROADS(bfs和dfs做法)

1 /*2 dfs比较好想&#xff0c;就是测试数据的问题&#xff0c;导致在遍历边的时候要倒着遍历才过&#xff01;3 */4 #include<iostream> 5 #include<cstdio>6 #include<cstring>7 #include<vector>8 #include<algorithm>9 #define Max 0x3f3f3f…

华为新系统 鸿蒙,旗舰CPU+鸿蒙OS!华为Mate家族重磅新品来袭

我们常说安卓平板的生态跟苹果iPad有很大差距&#xff0c;不论是应用质量还是原生系统支持&#xff0c;苹果都做的更好一些。可能也是因为这个原因&#xff0c;因此安卓平板&#xff0c;尤其是旗舰级别的平板至今除了三星之外&#xff0c;也就只有华为在做。作为安卓阵营两大厂…

mysql中用来取余数的函数是_MySQL常用函数-单行处理函数-字符串处理函数(更新中...)...

本篇文章用到的数据库表/* SQLyog Ultimate v12.09 (64 bit) MySQL - 5.7.23-log : Database - myemployees ********************************************************************* *//*!40101 SET NAMES utf8 */;/*!40101 SET SQL_MODE*/;/*!40014 SET OLD_UNIQUE_CHECKSUN…

HDU 1024Max Sum Plus Plus(最大m字段和)

/* 动态转移方程&#xff1a;dp[i][j]max(dp[i-1]a[i], max(dp[t][j-1])a[i]) (j-1<t<i) 表示的是前i个数j个字段和的最大值是多少&#xff01; */ 1 #include<iostream> 2 #include<cstdio>3 #include<cstring>4 #define N 10000 5 using nam…

html盒子模型页面居中,【静态页面架构】CSS之盒子模型

CSS架构盒子模型&#xff1b;以内容区(显示文本和图像)内边距(内容区至边距的距离)边距(内容区的边界)外边距(元素的边框之间的距离)1.边距&#xff1b;border属性&#xff1b;简写属性用来设置边距的上(top)右(right)下(bottom)左(left)。宽度&#xff0c;颜色和样式div{width…

最强动画制作人书包_声优访谈丨恋与制作人动画中配声优访谈——夏磊

亲爱的制作人们&#xff1a;距离恋与制作人动画上线还有6天&#xff01;今天的中配声优访谈嘉宾是在动画中为许墨献声的夏磊老师~固定布局 工具条上设置固定宽高背景可以设置被包含可以完美对齐背景图和文字以及制作自…

(单例设计模式中)懒汉式与饿汉式在多线程中的不同

/*目的&#xff1a;分析一下单例设计模式中&#xff0c;懒汉式与饿汉式在多线程中的不同&#xff01;开发时我们一般选择饿汉式&#xff0c;因为它简单明了&#xff0c;多线程中不会出现安全问题&#xff01;而饿汉式需要我们自己处理程序中存在的安全隐患&#xff0c;但是饿汉…

shiro修改html不生效,shiro中anon配置不生效

再配置shiro的时候&#xff0c;如下代码要注意&#xff1a;1、下述代码中必须是LinkedHashMap 而不能是HashMap。2、anon定义必须在authc之前否则anon定义不生效Beanpublic ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager){ShiroFilterFactor…

codesys com库_CoDeSys官方系统库在线下载,替换国内下载服务器教程

欢迎加入工控分享技术服务社区推荐阅读Codesys学习资料大全Codesys控制器关于CANopen总线的详细应用说明当你软件报以下错误&#xff0c;你可以直接下载&#xff0c;如果下载不成功&#xff0c;可以换个网络试一试&#xff0c;或者进行下面的操作。由于国内网络问题&#xff0c…

centos7恢复mysql数据库_MySQL数据库升级迁移填坑记

原库&#xff1a;*.*.101.73/74 系统环境: Suse 12.4MySQL: 5.7.29新库&#xff1a;*.*.110.46/47系统环境&#xff1a;CentOS7.7 64位MySQL版本: 5.7.30[一、数据库升级迁移场景]因业务侧在*.*.101.73/74 mysql数据库服务器上部署了java应用程序、HadoopHbase数据库等大数据…

so把asp页面生成静态的html,23、asp系列课程--server.URLEncode方法和server.HTMLEncode方法...

作者&#xff1a;杨凡来自&#xff1a;杨凡博客地址&#xff1a;blog.sina.com.cn/aboutshisanserver.URLEncode方法和server.HTMLEncode方法可以对字符串进行编码。我们一个一个的说。server.URLEncode可以对字符串进行URL编码转换&#xff0c;语法格式为&#xff1a;server.u…

poj 1905Expanding Rods

1 /*2 二分 几何3 弧长L&#xff0c; 圆半径R&#xff0c; 弧度 q&#xff0c; LR*q;4 二分&#xff1a; 弧度&#xff08;0~PI&#xff09; 或者 高度&#xff08;L/2~L&#xff09; 5 */6 #include<cstdio> 7 #include<iostream>8 #include<cmath>9…

java中同步嵌套引起的死锁事例代码

/*目的&#xff1a;自己写一个由于同步嵌套引起的死锁&#xff01;思路&#xff1a;多个线程在执行时&#xff0c;某一时刻&#xff0c;0-Thread绑定了LockA锁&#xff0c;1-Thread绑定了LockB锁&#xff01;当0-Thread要去绑定LockB锁时 和 1-Thread要去绑定LockA锁时都不能绑…

下列关于html5表单的多样输入方式,IT兄弟连 HTML5教程 HTML5表单 多样的输入类型1...

原标题&#xff1a;IT兄弟连 HTML5教程 HTML5表单 多样的输入类型1HTML5拥有多个新的表单输入类型&#xff0c;这些新特性提供了更好的输入控制和验证。并不是所有的主浏览器都支持新的input类型&#xff0c;不过我们可以在所有的主浏览器中使用它们&#xff0c;即使不被支持&a…