1.ベジェ曲線は数学が理解
3点が二次ベジエ曲線の破線定義し
、時間tでの
P0からQへ
の接続上の点までのQ-P1から、対応する接線であります
軌道ベジェ曲線の
レンダリング:
すぐ上の数学I、ベジェ曲線の間違った理解かもしれないが、Androidの開発者はAPIを使用したライン上のどの式を制御する必要はありません
2.描画Adroidベジェ曲線
描画2.1に。第二に注文
2.2。3次の描画
XMLレイアウト:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.denganzhi.cusomerwidget.canvas.PathActivity">
<com.denganzhi.cusomerwidget.canvas.PathView
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.denganzhi.cusomerwidget.canvas.PathView>
</LinearLayout>
達成するためのJavaコード:
public class PathView extends View {
public PathView(Context context) {
super(context);
}
Paint paint=null;
public PathView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
paint=new Paint();
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.STROKE);
paint.setAntiAlias(true);
paint.setStrokeWidth(5);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 6. 贝塞尔曲线api
Path path6=new Path();
path6.moveTo(100,400);
// 二阶贝塞尔曲线1
path6.quadTo(250,200,400,400);
// 二阶贝塞尔曲线2, 起点是上一个曲线的结束点
path6.quadTo(500,500,600,400);
// 三阶贝塞尔曲线,4个点
Path path7=new Path();
path7.moveTo(100,400);
path7.cubicTo(200,100,300,250,400,300);
canvas.drawPath(path6,paint);
canvas.drawPath(path7,paint);
}
}
3. PathMeasureは軌道経路長を計算します。
3.1。計算GETLENGTHトラック長
// PathMeasure 测量工具类
// 600 实际长度 path
PathMeasure pathMeasure1=new PathMeasure(path8,false);
// 800 绘制图形 闭合以后的长度
// PathMeasure pathMeasure2=new PathMeasure(path8,true);
// Log.e("denganzhi","length1:"+pathMeasure1.getLength());
float length1= pathMeasure1.getLength();
// path 可以绘制多条路径,
boolean nextCouner= pathMeasure1.nextContour(); //获取下一个路径,可能没有
// 获取第二条路径长度
float length2= pathMeasure1.getLength();
Log.e("denganzhi","第一个条路径长度:"+length1+ "nextCounter "+ nextCouner+ "第二条路径长度:"+length2);
// 第一个条路径长度:600.0nextCounter true第二条路径长度:160.0
paint.setColor(Color.BLACK);
canvas.drawPath(path8,paint);
出力: E / denganzhi:最初のパスの長さ:600.0nextCounter真第二の経路の長さ:160.0
3.2。GetSegment傍受弾道、中に新しいパスに
// PathMeasure 用于测量path路径长度
canvas.translate(100,100);
Path path8=new Path();
// 默认其实点是0,0
path8.lineTo(0,200);
path8.lineTo(200,200);
path8.lineTo(200,0);
RectF rect8=new RectF(10,10,50,50);
// 600 实际长度 path
PathMeasure pathMeasure1=new PathMeasure(path8,false);
// 800 绘制图形 闭合以后的长度
float length1= pathMeasure1.getLength();
paint.setColor(Color.BLACK);
canvas.drawPath(path8,paint);
// 路径截取
Path dst= new Path();
paint.setColor(Color.RED);
// dst 的起始点 dst.moveTo(x,x); 是否为上一个节点结束点,是否保存连续性
pathMeasure1.getSegment(0,400,dst,false);
canvas.drawPath(dst,paint);
傍受部分再描画の赤い部分
3.3。GetPosTanは、いくつかの長さその目的、および接線の座標を取得します(?)
// PathMeasure 用于测量path路径长度
canvas.translate(100,100);
Path path8=new Path();
// 默认其实点是0,0
path8.lineTo(0,200);
path8.lineTo(200,200);
path8.lineTo(200,0);
RectF rect8=new RectF(10,10,50,50);
path8.addRect(rect8, Path.Direction.CCW);
paint.setColor(Color.BLACK);
canvas.drawPath(path8,paint);
float[] pos=new float[2];
float[] tan= new float[2]; // tan=y/x
pathMeasure9.getPosTan(pathMeasure9.getLength()/4,pos,tan);
// postionx: 3.051759E-5 positiony: 50.0 tanx:-1.0 tany: 6.473757E-7
Log.e("denganzhi","postionx: "+pos[0]+" positiony: "+ pos[1] +" tanx:" +tan[0] + " tany: " + tan[1]);
canvas.drawPath(path9,paint);
出力:E / denganzhi:postionx:3.051759E-5位置j:50.0のTaNx:-1.0タニイ:6.473757E-7
統合コード:pathViewを開き
package com.denganzhi.cusomerwidget.canvas;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathMeasure;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Region;
import android.graphics.RegionIterator;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
/**
* Created by Administrator on 2020/3/15.
*/
public class PathView extends View {
public PathView(Context context) {
super(context);
}
Paint paint=null;
public PathView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
paint=new Paint();
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.STROKE);
paint.setAntiAlias(true);
paint.setStrokeWidth(5);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 6. 贝塞尔曲线api
Path path6=new Path();
path6.moveTo(100,400);
// 二阶贝塞尔曲线1
path6.quadTo(250,200,400,400);
// 二阶贝塞尔曲线2, 起点是上一个曲线的结束点
path6.quadTo(500,500,600,400);
// 三阶贝塞尔曲线,4个点
Path path7=new Path();
path7.moveTo(100,400);
path7.cubicTo(200,100,300,250,400,300);
// canvas.drawPath(path6,paint);
// canvas.drawPath(path7,paint);
// PathMeasure 用于测量path路径长度
canvas.translate(100,100);
Path path8=new Path();
// 默认其实点是0,0
path8.lineTo(0,200);
path8.lineTo(200,200);
path8.lineTo(200,0);
RectF rect8=new RectF(10,10,50,50);
path8.addRect(rect8, Path.Direction.CCW);
// PathMeasure 测量工具类
// 600 实际长度 path
PathMeasure pathMeasure1=new PathMeasure(path8,false);
// 800 绘制图形 闭合以后的长度
// PathMeasure pathMeasure2=new PathMeasure(path8,true);
// Log.e("denganzhi","length1:"+pathMeasure1.getLength());
float length1= pathMeasure1.getLength();
// path 可以绘制多条路径,
// boolean nextCouner= pathMeasure1.nextContour(); //获取下一个路径,可能没有
// 获取第二条路径长度
// float length2= pathMeasure1.getLength();
// Log.e("denganzhi","第一个条路径长度:"+length1+ "nextCounter "+ nextCouner+ "第二条路径长度:"+length2);
// 第一个条路径长度:600.0nextCounter true第二条路径长度:160.0
paint.setColor(Color.BLACK);
canvas.drawPath(path8,paint);
// 路径截取
Path dst= new Path();
paint.setColor(Color.RED);
// dst 的起始点 dst.moveTo(x,x); 是否为上一个节点结束点,是否保存连续性
pathMeasure1.getSegment(0,400,dst,false);
// canvas.drawPath(dst,paint);
// 获取某一段长度的坐标,切线
Path path9=new Path();
path9.addCircle(0,0,50,Path.Direction.CW);
PathMeasure pathMeasure9=new PathMeasure(path9,false);
float[] pos=new float[2];
float[] tan= new float[2]; // tan=y/x
pathMeasure9.getPosTan(pathMeasure9.getLength()/4,pos,tan);
// postionx: 3.051759E-5 positiony: 50.0 tanx:-1.0 tany: 6.473757E-7
Log.e("denganzhi","postionx: "+pos[0]+" positiony: "+ pos[1] +" tanx:" +tan[0] + " tany: " + tan[1]);
canvas.drawPath(path9,paint);
}
}