PathMeasure

419 阅读3分钟
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  falsetrue 有影响
        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;
}