您的位置:首页 > 移动开发 > Android开发

贝塞尔曲线经典实例

2017-04-01 09:13 134 查看

贝塞尔曲线经典实例,直接上代码

package com.example.administrator.testapplication;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.View;

/**
* Created by Administrator on 2017/3/31 0031.
*/

public class BezierViewDemo extends View {

private Paint mPaint;

private Path mPath;

private Point startPoint;
private Point endPoint;
// 辅助点
private Point assistPoint;

private Point a;
private Point b;
private Point c;

//系数
private float t = 0.0f;

private boolean isAdd = true;

private Runnable runnable;

public BezierViewDemo(Context context) {
super(context);
inits(context);
}

public BezierViewDemo(Context context, AttributeSet attrs) {
super(context, attrs);
inits(context);
}

public BezierViewDemo(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
inits(context);
}

/**
* 初始化
*
* @param context
*/
private void inits(Context context) {
this.context = context;
mPaint = new Paint();
this.mPath = new Path();
this.startPoint = new Point(50, 150);
this.endPoint = new Point(450, 150);
this.assistPoint = new Point(250, 450);
this.runnable = new Runnable() {
@Override
public void run() {
invalidate();
}
};
}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setAntiAlias(true);
mPaint.setStrokeWidth(10);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(Color.RED);

mPath.reset();
//起点
mPath.moveTo(startPoint.x, startPoint.y);
//mPath
mPath.quadTo(assistPoint.x, assistPoint.y, endPoint.x, endPoint.y);
//画Path
canvas.drawPath(mPath, mPaint);
//画控制点
canvas.drawPoint(assistPoint.x, assistPoint.y, mPaint);

//画线
mPaint.setColor(Color.YELLOW);
mPath.reset();
mPath.moveTo(startPoint.x, startPoint.y);
mPath.lineTo(assistPoint.x, assistPoint.y);
mPath.lineTo(endPoint.x, endPoint.y);
canvas.drawPath(mPath, mPaint);
//画点
mPaint.setColor(Color.BLACK);
canvas.drawCircle(assistPoint.x, assistPoint.y, 8, mPaint);
canvas.drawCircle(startPoint.x, startPoint.y, 8, mPaint);
canvas.drawCircle(endPoint.x, endPoint.y, 8, mPaint);

if (t >= 1) {
this.isAdd = false;
}
if (t <= 0) {
this.isAdd = true;
}
if (isAdd) {
t += 0.005f;
} else {
t -= 0.005f;
}
//画动态图
a = getB1(t,startPoint,assistPoint);
b = getB2(t,startPoint,endPoint,assistPoint);
c = getB1(t,assistPoint,endPoint);

mPath.reset();
mPaint.setColor(Color.GREEN);
//起点
mPath.moveTo(startPoint.x, startPoint.y);
//mPath
mPath.quadTo(a.x,a.y,b.x,b.y);
//画Path
canvas.drawPath(mPath, mPaint);
//画线
canvas.drawLine(a.x,a.y,c.x,c.y,mPaint);
//画点
mPaint.setColor(Color.GRAY);
canvas.drawCircle(a.x,a.y,8,mPaint);
canvas.drawCircle(b.x,b.y,8,mPaint);
canvas.drawCircle(c.x,c.y,8,mPaint);

this.postDelayed(runnable, 30);
}

//二次方贝塞尔曲线
private Point getB2(float t,Point sPoint,Point ePoint,Point cPoint){
int x = (int) ((1 - t) * (1 - t) * sPoint.x + 2 * t * (1 - t) * cPoint.x + t * t * ePoint.x);
int y = (int) ((1 - t) * (1 - t) * sPoint.y + 2 * t * (1 - t) * cPoint.y + t * t * ePoint.y);
return new Point(x,y);
}

//线性贝塞尔曲线
private Point getB1(float t,Point sPoint,Point ePoint){
int x = (int) ((1 - t) * sPoint.x +  t * ePoint.x);
int y = (int) ((1 - t) * sPoint.y +  t * ePoint.y);
return new Point(x,y);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息