public class PathMeasureView extends View
{
private Paint mPaint = new Paint();
private Paint mLinePaint = new Paint(); //坐标系
private Bitmap mBitmap;
public PathMeasureView(Context context)
{
super(context);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(Color.BLACK);
mPaint.setStrokeWidth(4);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(Color.BLACK);
mPaint.setStrokeWidth(4);
mLinePaint.setStyle(Paint.Style.STROKE);
mLinePaint.setColor(Color.RED);
mLinePaint.setStrokeWidth(6);
//缩小图片
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;
mBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.arrow,options);
}
@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
canvas.drawLine(0, getHeight() / 2, getWidth(), getHeight() / 2, mLinePaint);//横 线
canvas.drawLine(getWidth() / 2, 0, getWidth() / 2, getHeight(), mLinePaint);//竖 线
canvas.translate(getWidth() / 2, getHeight() / 2);//平移画布至屏幕中心
/*Path path = new Path();
path.lineTo(0,200);
path.lineTo(200,200);
path.lineTo(200,0);
canvas.drawPath(path,mPaint);
*//**
* pathMeasure需要关联一个创建好的path, forceClosed会影响Path的测量结果
*//*
PathMeasure pathMeasure = new PathMeasure();
pathMeasure.setPath(path, false);
Log.d("data", "onDraw:forceClosed=true "+ pathMeasure.getLength());*/
/* Path path=new Path();
//创建一个矩形 Path.Direction.CW 表示顺时针绘制
path.addRect(-200,-200,200,200,Path.Direction.CW);
Path dst=new Path();
//dst 在添加一条路劲
dst.lineTo(-300,-300);
//创建一个PathMeasure 关联 path forceClosed设置为false 测量的结果才精确
PathMeasure pathMeasure=new PathMeasure(path,false);
//从path中截取 从两百的位置开始 1000的位置结束 截取的结果保存到dst中 startWithMoveTo false和 true 有影响
pathMeasure.getSegment(200,1000,dst,false);
//绘制path矩形
canvas.drawPath(path,mPaint);
//绘制dst 截取到的路劲 红色线条
mLinePaint.setColor(Color.GRAY);
canvas.drawPath(dst,mLinePaint);*/
/* Path path = new Path();
path.addRect(-100, -100, 100, 100, Path.Direction.CW);//添加一个矩形
path.addOval(-200, -200, 200, 200, Path.Direction.CW);//添加一个椭圆
canvas.drawPath(path, mPaint);
PathMeasure pathMeasure = new PathMeasure(path, false);
Log.d("data", "onDraw:forceClosed=false "+ pathMeasure.getLength());//得到的是中间矩形的周长,而外面的圆的周长,没有去获取
//调用 pathMeasure.nextContour() 定位到下一条path 就是圆
pathMeasure.nextContour();
Log.d("data", "onDraw:forceClosed=false "+ pathMeasure.getLength());//得到圆的周长*/
//public boolean getPosTan(float distance, float pos[], float tan[])
//distance 表示距离path起点的长度 取值范围【0-path的长度】
//pos[] 长度为2的浮点型数组 存放的是当前点在画布上的位置 分别表示的是(x,y)的坐标
//float tan[] 同样是一个 长度为2的浮点型数组 表示的是当前点在曲线上的方向 通过它的方向够获取到 这点的切线与x轴的夹角
mFloat += 0.01;
if (mFloat >= 1){
mFloat = 0;
}
//添加一个圆
path.reset();
path.addCircle(0, 0, 200, Path.Direction.CW);
canvas.drawPath(path, mPaint);
//方法一
// PathMeasure pathMeasure = new PathMeasure(path, false);
// pathMeasure.getPosTan(pathMeasure.getLength()*mFloat, pos, tan);
// Log.d("data", "onDraw: pos[0]=" + pos[0] + ";pos[1]=" + pos[1]);
// Log.d("data", "onDraw: tan[0]=" + tan[0] + ";tan[1]=" + tan[1]);
// // tan[0]=0.0;tan[1]=1.0
// // tan[0]=0.0 表示夹角的邻边长度 tan[1]=1.0表示夹角的对边长度 当夹角为90度是 邻边长度=0,对边长度=1
// //计算出当前的切线与x轴夹角的度数
// double degrees = Math.atan2(tan[1], tan[0]) * 180.0 / Math.PI;
// //double degreess = Math.atan2(pos[1], pos[0]) * 180.0 / Math.PI;
// // Log.d("data", "degrees: "+degrees); 45.00003622254719
// // Log.d("data", "degreess: "+degreess); -44.999965999099686
// //调整箭头的旋转角度 mBitmap.getWidth()/2,mBitmap.getHeight()/2表示已 该图片的中心进行旋转
// matrix.reset();
// //进行角度旋转
// matrix.postRotate((float) degrees,mBitmap.getWidth()/2,mBitmap.getHeight()/2);
// //这一步很重要 将图片的绘制点中心与当前点重合
// matrix.postTranslate(pos[0] - mBitmap.getWidth() / 2, pos[1]-mBitmap.getHeight() / 2);
// canvas.drawBitmap(mBitmap,matrix,mPaint);
//方法二
PathMeasure pathMeasure = new PathMeasure(path, false);
//将pos信息和tan信息保存在mMatrix中
pathMeasure.getMatrix(pathMeasure.getLength() * mFloat, matrix, PathMeasure.POSITION_MATRIX_FLAG | PathMeasure.TANGENT_MATRIX_FLAG);
//将图片的绘制点中心与当前点重合
matrix.preTranslate(-mBitmap.getWidth() / 2, -mBitmap.getHeight() / 2);
canvas.drawBitmap(mBitmap,matrix, mPaint);
invalidate();
}
private Path path = new Path();
private float[] pos = new float[2];
private float[] tan = new float[2];
//使用Matrix 来控制图片的位置
private Matrix matrix=new Matrix();
private float mFloat;
}
复制代码
转载于:https://juejin.im/post/5d084288f265da1b95705880