Android贝塞尔曲线初步学习第一课

所属分类: 软件编程 / Android 阅读数: 20
收藏 0 赞 0 分享

贝塞尔曲线有一阶、二阶、三阶、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实现悬浮窗体效果,显示悬浮窗口,窗口可以拖动,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Andriod studio 打包aar 的方法

这篇文章主要介绍了Andriod studio 打包aar的方法,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
收藏 0 赞 0 分享

Android加载loading对话框的功能及实例代码(不退出沉浸式效果)

这篇文章主要介绍了Android加载loading对话框的功能及实例代码,不退出沉浸式效果,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中LayoutInflater.inflater()的正确打开方式

这篇文章主要给大家介绍了关于Android中LayoutInflater.inflater()的正确打开方式,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Delphi在Android下使用Java库的方法

这篇文章主要介绍了Delphi在Android下使用Java库的方法,本文以Android的USB串口通讯库为例,给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Retrofit2日志拦截器的使用

这篇文章主要介绍了Retrofit2日志拦截器的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Android创建外部lib库及自定义View的图文教程

这篇文章主要给大家介绍了关于Android创建外部lib库及自定义View的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Android分享微信小程序失败的一些事小结

这篇文章主要给大家介绍了关于Android分享微信小程序失败一些事,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Android分享微信小程序技巧之图片优化

这篇文章主要给大家介绍了关于Android分享微信小程序技巧之图片优化的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Android Viewpager实现无限循环轮播图

这篇文章主要为大家详细介绍了Android Viewpager实现无限循环轮播图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享
查看更多