【Android UI】贝塞尔曲线 ③ ( 贝塞尔曲线关键点坐标记录 | 二阶贝塞尔曲线示例 )

举报
韩曙亮 发表于 2022/07/28 23:17:45 2022/07/28
【摘要】 文章目录 一、贝塞尔曲线关键点坐标记录二、二阶贝塞尔曲线示例三、代码示例 贝塞尔曲线参考 : https://github.com/venshine/BezierMaker ...


贝塞尔曲线参考 : https://github.com/venshine/BezierMaker





一、贝塞尔曲线关键点坐标记录



贝塞尔曲线 绘制时 , 使用 android.graphics.Path 记录 贝塞尔曲线 的 ① 起始点 , ② 终止点 , 以及 ③ 若干 控制点 ;

一阶贝塞尔曲线有 0 0 0 个控制点 , 二阶贝塞尔曲线有 1 1 1 个控制点 , 三阶贝塞尔曲线有 2 2 2 个控制点 , ⋯ \cdots , n n n 阶贝塞尔曲线 n − 1 n-1 n1 个控制点 ;





二、二阶贝塞尔曲线示例



创建 android.graphics.Path 实例对象后 , 首先调用 Path#moveTo 方法 , 设置起始点 ;

Path#moveTo 函数原型如下 :

    /**
     * 将下一个轮廓的起点设置为点(x,y)。
     *
     * @param x 新轮廓起点的x坐标
     * @param y 新轮廓起点的y坐标
     */
    public void moveTo(float x, float y) {
        nMoveTo(mNativePath, x, y);
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

然后调用 Path#quadTo 方法 , 设置 二阶贝塞尔曲线 的 控制点终止点 ;

    /**
     * 从最后一个点开始添加二次贝塞尔,
     * 接近控制点(x1,y1),并在(x2,y2)处结束。
     * 如果未对此轮廓进行moveTo()调用,
     * 则第一个点将自动设置为(0,0)。
     *
     * @param x1 二次曲线上控制点的x坐标
     * @param y1 二次曲线上控制点的y坐标
     * @param x2 二次曲线端点的x坐标
     * @param y2 二次曲线端点的y坐标
     */
    public void quadTo(float x1, float y1, float x2, float y2) {
        isSimplePath = false;
        nQuadTo(mNativePath, x1, y1, x2, y2);
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

最后 , 调用 Canvas 画布的 Canvas#drawPath 方法 , 将上述设置 起始点 控制点 终止点 的 Path 实例对象 绘制到画布上 ;





三、代码示例



package kim.hsl.android_ui;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.Nullable;

public class BesselCurve2 extends View {

    public BesselCurve2(Context context) {
        this(context, null);
    }

    public BesselCurve2(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public BesselCurve2(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
        super.onSizeChanged(width, height, oldWidth, oldHeight);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        // 初始化 曲线 和 画笔 实例对象
        Path path = new Path();
        Paint paint = new Paint();
        paint.setColor(Color.BLACK);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(20);

        // 设置起始点
        path.moveTo(0, getHeight() / 2F);

        // 设置控制点 和 终止点
        path.quadTo(getWidth() / 2F, getHeight(), getWidth(), getHeight() / 2F);

        // 绘制贝塞尔曲线
        canvas.drawPath(path, paint);
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

绘制效果 :

在这里插入图片描述

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/125918335

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。