Android 贝赛尔曲线
这个小 Dome 是学习曲线的入门,以便今后的学习更加容易。
package com.example.quxian;
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.graphics.PointF;
import android.view.View;
/**
* Created by Administrator on 2017/10/22.
*/
public class Towlion extends View {
private Paint paint;
private PointF start;
private Point end,zhondian;
public Towlion(Context context) {
super(context);
//创建一个画笔
paint = new Paint();
paint.setStrokeWidth(10);//设置线的宽度
paint.setStyle(Paint.Style.STROKE);//设置样式
paint.setTextSize(60);
start = new PointF(0, 0);//创建一个点
start.set(300,300);
end = new Point(0, 0);//创建一个点
end.set(1000,350);
zhondian = new Point(0, 0);//创建一个点
zhondian.set(800,450);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//设置点的style
paint.setColor(Color.RED);
paint.setStrokeWidth(20);
//加入点
canvas.drawPoint(start.x, start.y, paint);
canvas.drawPoint(zhondian.x, zhondian.y, paint);
canvas.drawPoint(end.x, end.y, paint);
/**
* 俩点连线
*/
//canvas.drawLine(start.x,start.y,zhondian.x,zhondian.y,paint);
//canvas.drawLine(zhondian.x,zhondian.y,end.x, end.y,paint);
paint.setColor(Color.GRAY);
paint.setStrokeWidth(8);
/**
* 抛物线
*/
Path path = new Path();//创建路径
//起点
path.moveTo(start.x, start.y);
path.quadTo(400, 500, zhondian.x,zhondian.y);
canvas.drawPath(path, paint);
Path paths = new Path();//创建路径
paths.moveTo(zhondian.x,zhondian.y);
paths.quadTo(900, 200, end.x, end.y);
canvas.drawPath(paths, paint);
}
}
package com.example.beserli;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PointF;
import android.view.MotionEvent;
import android.view.View;
/**
* Created by huqing on 2016/6/27.
*/
public class TwoBezier extends View {
private Paint mPaint;
private int centerX, centerY;
private PointF start, end, fingerPoint;
/**
* 使用,例:
* TwoBezier mBezier = new TwoBezier(this);
* setContentView(mBezier);
*
* @param context
*/
public TwoBezier(Context context) {
super(context);
//画笔
mPaint = new Paint();
mPaint.setStrokeWidth(8);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setTextSize(60);
//三点确定该二阶曲线
start = new PointF(0, 0);
end = new PointF(0, 0);
fingerPoint = new PointF(0, 0);
}
/**
* 手指触碰时获取当前手指坐标
* @param event
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
// 根据触摸位置更新控制点,并提示重绘
fingerPoint.x = event.getX();
fingerPoint.y = event.getY();
invalidate();//调用onDraw方法
return true;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 绘制数据点和控制点
mPaint.setColor(Color.GRAY);
mPaint.setStrokeWidth(20);
canvas.drawPoint(start.x, start.y, mPaint);
canvas.drawPoint(end.x, end.y, mPaint);
canvas.drawPoint(fingerPoint.x, fingerPoint.y, mPaint);
// 绘制辅助线
mPaint.setStrokeWidth(4);
canvas.drawLine(start.x, start.y, fingerPoint.x, fingerPoint.y, mPaint);
canvas.drawLine(end.x, end.y, fingerPoint.x, fingerPoint.y, mPaint);
// 绘制贝塞尔曲线
mPaint.setColor(Color.RED);
mPaint.setStrokeWidth(8);
//绘制曲线路径
Path path = new Path();
//起点
path.moveTo(start.x, start.y);
//关键方法:谷歌封装好的贝塞尔曲线绘制方法quadTo,给出控制点和终点
path.quadTo(fingerPoint.x, fingerPoint.y, end.x, end.y);
canvas.drawPath(path, mPaint);
}
/**
* onSizeChanged的启动时间在onDraw之前,初始化该View时获取到长宽
*/
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
//中心点
centerX = w / 2;
centerY = h / 2;
//左侧点
start.x = centerX - 200;
start.y = centerY;
//右侧点
end.x = centerX + 200;
end.y = centerY;
//控制点,就是手指移动的那个点
fingerPoint.x = centerX;
fingerPoint.y = centerY - 100;
}
}