贝塞尔曲线有一阶、二阶、三阶、N阶

一阶就是一条直线,有起点终点,没有控制点,对应方法就是
canvas.drawLine(float startX, float startY, float stopX, float stopY, @NonNull Paint paint) ;
二阶为曲线,有起点终点,一个控制点,对应方法就是
path.quadTo(float x1, float y1, float x2, float y2);
其中x1、y1为控制点坐标, x2、y2为终点坐标,效果如下:
三阶由俩个控制点控制,对应方法就是
path.cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);
其中x1、y1、x2、y2为两个控制点坐标, x3、y3为终点坐标,效果如下:
做一个demo巩固一下用法:
新建一个SecondBezierView继承View,重写构造方法、初始化画笔、固定起点和终点的坐标,重写onTouchEvent()方法获取当前点击的点为控制点:
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
mControlX = event.getX();
mControlY = event.getY();
invalidate();
break;
}
return true;
}
在onDraw()方法中画点、画连接线、画文本、画二阶贝塞尔曲线
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(mStartX, mStartY, 8, mLinePaint);
canvas.drawText("起点", mStartX, mStartY, mLinePaint);
canvas.drawCircle(mEndX, mEndY, 8, mLinePaint);
canvas.drawText("终点", mEndX, mEndY, mLinePaint);
canvas.drawCircle(mControlX, mControlY, 8, mLinePaint);
canvas.drawText("控制点", mControlX, mControlY, mLinePaint);
canvas.drawLine(mStartX, mStartY, mControlX, mControlY, mLinePaint);
canvas.drawLine(mEndX, mEndY, mControlX, mControlY, mLinePaint);
mBezierPath.reset();//因为不断重绘,path的路径也要重置,不然页面上会显示很多条线
mBezierPath.moveTo(mStartX, mStartY);//移至起点
mBezierPath.quadTo(mControlX, mControlY, mEndX, mEndY);//二阶贝塞尔曲线,传入控制点和终点坐标
canvas.drawPath(mBezierPath, mBezierPaint);
}
最后添加一个回弹的动画,用的是OvershootInterpolator插值器,在onTouchEvent的MotionEvent.ACTION_UP中:
case MotionEvent.ACTION_UP:
ValueAnimator animX = ValueAnimator.ofFloat(mControlX, getWidth() / 2);
animX.setDuration(500);
animX.setInterpolator(new OvershootInterpolator());
animX.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
mControlX = (float) animation.getAnimatedValue();
invalidate();
}
});
animX.start();
ValueAnimator animY = ValueAnimator.ofFloat(mControlY, getHeight() / 2);
animY.setDuration(500);
animY.setInterpolator(new OvershootInterpolator());
animY.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
mControlY = (float) animation.getAnimatedValue();
invalidate();
}
});
animY.start();
break;
再来个三阶的
主要就是用到了多点触控:
private boolean mIsSecondPoint = false;
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {//多点触控
case MotionEvent.ACTION_POINTER_DOWN:
mIsSecondPoint = true;
break;
case MotionEvent.ACTION_POINTER_UP:
mIsSecondPoint = false;
break;
case MotionEvent.ACTION_MOVE:
mControlX1 = event.getX(0);//获取控制点1的横纵坐标
mControlY1 = event.getY(0);
if (mIsSecondPoint) {
mControlX2 = event.getX(1);//获取控制点2的横纵坐标
mControlY2 = event.getY(1);
}
invalidate();
break;
}
return true;
}
然后再onDraw()中画三阶贝塞尔曲线
mBezierPath.reset(); mBezierPath.moveTo(mStartX, mStartY); mBezierPath.cubicTo(mControlX1, mControlY1, mControlX2, mControlY2, mEndX, mEndY); canvas.drawPath(mBezierPath, mBezierPaint);
大功告成,打完收工。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android
# 贝塞尔曲线
# Android把商品添加到购物车的动画效果(贝塞尔曲线)
# Android中贝塞尔曲线的绘制方法示例代码
# android中贝塞尔曲线的应用示例
# Android 利用三阶贝塞尔曲线绘制运动轨迹的示例
# Android贝塞尔曲线初步学习第三课 Android实现添加至购物车的运动轨迹
# Android贝塞尔曲线实现手指轨迹
# Android贝塞尔曲线实现填充不规则图形并随手指运动
# Android使用贝塞尔曲线仿QQ聊天消息气泡拖拽效果
# Android贝塞尔曲线实现消息拖拽消失
# android贝塞尔曲线实现波浪效果
# 塞尔
# 多点
# 重写
# 的是
# 触控
# 有一
# 也要
# 再来
# 大功告成
# 然后再
# 做一个
# 打完
# 上会
# 大家多多
# 移至
# 新建一个
# 点为
# 插值
# demo
# SecondBezierView
相关文章:
营销式网站制作方案,销售哪个网站招聘效果最好?
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
如何用美橙互联一键搭建多站合一网站?
宝塔面板如何快速创建新站点?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
独立制作一个网站多少钱,建立网站需要花多少钱?
建站主机CVM配置优化、SEO策略与性能提升指南
如何通过免费商城建站系统源码自定义网站主题与功能?
北京营销型网站制作公司,可以用python做一个营销推广网站吗?
网站制作公司排行榜,抖音怎样做个人官方网站
如何在建站宝盒中设置产品搜索功能?
制作国外网站的软件,国外有哪些比较优质的网站推荐?
Python多线程使用规范_线程安全解析【教程】
网站制作大概多少钱一个,做一个平台网站大概多少钱?
想学网站制作怎么学,建立一个网站要花费多少?
建站之星安装后界面空白如何解决?
制作网站公司那家好,网络公司是做什么的?
建站之星会员如何解锁更多建站功能?
如何通过远程VPS快速搭建个人网站?
如何在腾讯云免费申请建站?
XML的“混合内容”是什么 怎么用DTD或XSD定义
北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?
如何选择网络建站服务器?高效建站必看指南
建站之星2.7模板:企业网站建设与h5定制设计专题
如何注册花生壳免费域名并搭建个人网站?
盐城做公司网站,江苏电子版退休证办理流程?
电商网站制作公司有哪些,1688网是什么意思?
如何快速查询域名建站关键信息?
如何选择适合PHP云建站的开源框架?
建站之星如何通过成品分离优化网站效率?
c# 服务器GC和工作站GC的区别和设置
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
Swift中switch语句区间和元组模式匹配
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
免费ppt制作网站,有没有值得推荐的免费PPT网站?
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
如何通过VPS建站无需域名直接访问?
制作表格网站有哪些,线上表格怎么弄?
制作网站的模板软件,网站怎么建设?
免费网站制作appp,免费制作app哪个平台好?
,购物网站怎么盈利呢?
如何通过虚拟主机空间快速建站?
建站之星伪静态规则如何设置?
如何获取免费开源的自助建站系统源码?
网站制作难吗安全吗,做一个网站需要多久时间?
家具网站制作软件,家具厂怎么跑业务?
b2c电商网站制作流程,b2c水平综合的电商平台?
建站之星后台密码遗忘或太弱?如何重置与强化?
网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?
*请认真填写需求信息,我们会在24小时内与您取得联系。