怎么在Android应用中实现一个贝塞尔曲线-创新互联

这篇文章给大家介绍怎么在Android应用中实现一个贝塞尔曲线,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

为达孜等地区用户提供了全套网页设计制作服务,及达孜网站建设行业解决方案。主营业务为网站设计、成都做网站、达孜网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

贝塞尔曲线有一阶、二阶、三阶、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为终点坐标,效果如下:

怎么在Android应用中实现一个贝塞尔曲线

三阶由俩个控制点控制,对应方法就是

path.cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);

其中x1、y1、x2、y2为两个控制点坐标, x3、y3为终点坐标,效果如下:

怎么在Android应用中实现一个贝塞尔曲线

做一个demo巩固一下用法:

怎么在Android应用中实现一个贝塞尔曲线

新建一个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;

再来个三阶的

怎么在Android应用中实现一个贝塞尔曲线

主要就是用到了多点触控:

 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应用中实现一个贝塞尔曲线-创新互联
本文网址:http://myzitong.com/article/piico.html