Android 高级UI10 Path及其贝塞尔曲线

Android 高级UI 目录
Path工具类:用来记录线条的轨迹路径
canvas.draw(path,paint);
贝塞尔曲线
现实生活当中,任何的曲线和曲面都可以用贝塞尔公式来解决。
比如:

1.设计贝塞尔曲线或者贝塞尔曲线效果图
2.怎么去得到贝塞尔曲线的几个要素(比如二阶贝塞尔:p0初始位置,p1拐点,p2结束点)
p1拐点如何确定,可以通过工具来确定,比如Photoshop点钢笔工具等

原理和简单推导(以三阶为例):

P0P02P2是一条抛物线上顺序三个不同的点。过P0P2点的两切线交于P1点,在P02点的切线交P0P1P2P1P01P11,则如下比例成立:

这是所谓抛物线的三切线定理。

P0P2固定,引入参数t,令上述比值为t:(1-t),即有:

t从0变到1,第一、二式就分别表示控制二边形的第一、二条边,它们是两条一次Bezier曲线。将一、二式代入第三式得:

t从0变到1时,它表示了由三顶点P0、P1、P2三点定义的一条二次Bezier曲线。

并且表明:

二次Bezier曲线P02可以定义为分别由前两个顶点(P0,P1)和后两个顶点(P1,P2)决定的一次Bezier曲线的线性组合**。

依次类推,

由四个控制点定义的三次Bezier曲线P03可被定义为分别由(P0,P1,P2)和(P1,P2,P3)确定的二条二次Bezier曲线的线性组合,由(n+1)个控制点Pi(i=0,1,...,n)定义的n次Bezier曲线P0n可被定义为分别由前、后n个控制点定义的两条(n-1)次Bezier曲线P0n-1P1n-1的线性组合:

image

由此得到Bezier曲线的递推计算公式

image

这就是这就是de Casteljau算法,可以简单阐述三阶贝塞尔曲线原理。

Bézier curve(贝塞尔曲线)是应用于二维图形应用程序的数学曲线。 曲线定义:起始点、终止点(也称锚点)、控制点。通过调整控制点,贝塞尔曲线的形状会发生变化。 1962年,法国数学家Pierre Bézier第一个研究了这种矢量绘制曲线的方法,并给出了详细的计算公式,因此按照这样的公式绘制出来的曲线就用他的姓氏来命名,称为贝塞尔曲线。

以下公式中:B(t)为t时间下 点的坐标;

P0为起点,Pn为终点,Pi为控制点

一阶贝塞尔曲线(线段):

image.png
image

意义:由 P0 至 P1 的连续点, 描述的一条线段

二阶贝塞尔曲线(抛物线):

image

原理:由 P0 至 P1 的连续点 Q0,描述一条线段。
由 P1 至 P2 的连续点 Q1,描述一条线段。
由 Q0 至 Q1 的连续点 B(t),描述一条二次贝塞尔曲线。

经验:P1-P0为曲线在P0处的切线。

三阶贝塞尔曲线:

image

通用公式:

image.png

高阶贝塞尔曲线:

4阶曲线:

image

5阶曲线:

image
二阶贝塞尔曲线
public class WaveView extends View {

    private Paint paint;
    private Path path;

    public WaveView(Context context) {
        super(context);

    }

    public WaveView(Context context,
            @Nullable AttributeSet attrs) {
        super(context, attrs);

        init();
    }

    private void init() {
        path = new Path();
        paint = new Paint();
        paint.setColor(Color.RED);
        paint.setStyle(Style.STROKE);
        paint.setStrokeWidth(10);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //第一个点--起始点
        path.moveTo(100, 400);
        //二阶贝塞尔曲线1

        path.quadTo(250, 200, 400, 400);

        //二阶贝塞尔曲线2(后面的曲线的起始点默认是接着上一个曲线的结束点)
        path.quadTo(550, 600, 700, 400);
        //关闭路径(将起点和终点闭合)
        path.close();
        canvas.drawPath(path, paint);

    }
}
三阶贝塞尔曲线
        path.moveTo(100, 700);
        path.cubicTo(50, 500, 550, 500, 700, 700);
        canvas.drawPath(path, paint);
波浪实例
public class WaveView extends View {

    private Paint paint;
    private Path path;

    //波长
    private int waveLength = 800;
    private int dx;
    private int dy;

    public WaveView(Context context) {
        super(context);

    }

    public WaveView(Context context,
            @Nullable AttributeSet attrs) {
        super(context, attrs);

        init();
    }

    private void init() {
        path = new Path();
        paint = new Paint();
        paint.setColor(Color.RED);
        paint.setStyle(Style.FILL_AND_STROKE);
        paint.setStrokeWidth(10);
    }

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

        path.reset();
        int originY = 500;
//        if(dy<originY + 150){
//            dy += 30;
//        }
        int halfWaveLength = waveLength / 2;
        path.moveTo(-waveLength + dx, originY - dy);

        //屏幕宽度里面画多少哥波长
        for (int i = -waveLength; i < getWidth() + waveLength; i += waveLength) {

            //二阶贝塞尔曲线1
            /**
             * 相对于起始点的增量
             */
            path.rQuadTo(halfWaveLength / 2, -150, halfWaveLength, 0);
            path.rQuadTo(halfWaveLength / 2, 150, halfWaveLength, 0);

        }
        //颜色填充
        //画一个封闭的空间
        path.lineTo(getWidth(), getHeight());
        path.lineTo(0, getHeight());
        path.close();
        canvas.drawPath(path, paint);

    }

    public void startAnimation() {
        ValueAnimator animator = ValueAnimator.ofInt(0, waveLength);
        animator.setDuration(1000);
        animator.setInterpolator(new LinearInterpolator());
        //无限循环
        animator.setRepeatCount(ValueAnimator.INFINITE);
        animator.addUpdateListener(new AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                dx = (int) animation.getAnimatedValue();
                postInvalidate();
            }
        });
        animator.start();
    }

}
调用
WaveView waveView = findViewById(R.id.waveView);
waveView.startAnimation();
特别感谢:

http://blog.csdn.net/tianhai110/article/details/2203572

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,123评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,031评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,723评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,357评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,412评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,760评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,904评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,672评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,118评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,456评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,599评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,264评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,857评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,731评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,956评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,286评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,465评论 2 348

推荐阅读更多精彩内容

  • 今天是我参加挑战的第16天 放手爱—让孩子自己学会成长 春节马上到了,一年一度的人口大迁徙也来了,我家也在其...
    王琦2020阅读 185评论 0 1
  • 特别喜欢中央二套的《对话》栏目,喜欢主持人陈伟鸿 这次的工作会议以“对话”模式开启,我也喜欢我们的主持人…喜欢源自...
    Molly喵小北阅读 250评论 0 1
  • 似曾相识般熟悉的见面 遇见你,我倾心一样的欢喜 花朵用色彩争奇斗艳, 蜜蜂聚芬芳酝酿香甜。 天地的美,用心书写灵感...
    听风忆雪_208b阅读 133评论 0 5