Android 贝赛尔曲线

来源:互联网 发布:python raw input 编辑:程序博客网 时间:2024/05/22 17:37

这个小 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;
    }
}









原创粉丝点击