Android自定义View绘制贝塞尔曲线的方法

2022-10-07,,,,

本文实例为大家分享了android自定义view绘制塞尔曲线的具体代码,供大家参考,具体内容如下

在平面内任选 3 个不共线的点,依次用线段连接。

在第一条线段上任选一个点 d。计算该点到线段起点的距离 ad,与该线段总长 ab 的比例。

根据上一步得到的比例,从第二条线段上找出对应的点 e,使得 ad:ab = be:bc。

连接这两点 de。

从新的线段 de 上再次找出相同比例的点 f,使得 df:de = ad:ab = be:bc。

到这里,我们就确定了贝塞尔曲线上的一个点 f。接下来,请稍微回想一下中学所学的极限知识,让选取的点 d 在第一条线段上从起点 a 移动到终点 b,找出所有的贝塞尔曲线上的点 f。所有的点找出来之后,我们也得到了这条贝塞尔曲线。

回过头来看这条贝塞尔曲线,为了确定曲线上的一个点,需要进行两轮取点的操作,因此我们称得到的贝塞尔曲线为二次曲线(这样记忆很直观,但曲线的次数其实是由前面提到的伯恩斯坦多项式决定的)。

三个点的基本关系如下:

android 的path类提供了绘制二阶贝塞尔曲线的方法,使用方法如下:

public class curveview extends view{

    private float msupx;
    private float msupy;

    private int mwidth;
    private int mheight;

    private paint mpaint;
    private path mpath;

    public curveview(context context) {
        super(context);
    }

    public curveview(context context, attributeset attrs) {
        super(context, attrs, 0);
        mpaint = new paint();
        mpaint.setstyle(paint.style.stroke);
        mpaint.setstrokewidth(10);
        mpath = new path();
    }

    @override
    protected void onmeasure(int widthmeasurespec, int heightmeasurespec) {
        int widthsize = measurespec.getsize(widthmeasurespec);
        int widthmode = measurespec.getmode(widthmeasurespec);
        int heightsize = measurespec.getsize(heightmeasurespec);
        int heightmode = measurespec.getmode(heightmeasurespec);
        if (widthmode == measurespec.exactly) {
            mwidth = widthsize;
        }
        if (heightmode == measurespec.exactly) {
            mheight = heightsize;
        }
        setmeasureddimension(mwidth, mheight);
    }

    @override
    protected void ondraw(canvas canvas) {
        mpath.reset();
        mpath.moveto(mwidth / 5, mheight / 2);  //设置起点
        mpath.quadto(msupx, msupy, mwidth * 4 / 5, mheight / 2);  //设置辅助点和终点
        canvas.drawpath(mpath, mpaint);
        canvas.drawpoint(msupx, msupy, mpaint);
        super.ondraw(canvas);
    }

    @override
    public boolean ontouchevent(motionevent event) {
        switch (event.getaction()){
            case motionevent.action_move:
                msupx = event.getx();
                msupy = event.gety();
                invalidate();
        }
        return true;
    }
}

draw以后效果如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

《Android自定义View绘制贝塞尔曲线的方法.doc》

下载本文的Word格式文档,以方便收藏与打印。