如何在android java中使用canvas ondraw()绘制导航路径

hof1towb  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(247)

我是新的java绘图,我想实现一个导航系统,让用户可以在Map上导航。java函数“ondraw”是实现的,因此它可以显示用户在Map上的位置,也可以显示他的移动。以下是我的代码:

class CanvasView extends View {
        private Paint paint = new Paint();
        private Path path = new Path();
        private float lineX = Position.x_axis;
        private float lineY = Position.y_axis;
        private float lastX = Position.x_axis;
        private float lastY = Position.y_axis;

        public CanvasView(Context context) {
            super(context);
            paint.setAntiAlias(true);
            paint.setStrokeWidth(10f);
            paint.setColor(Color.BLACK);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeJoin(Paint.Join.ROUND);

        }

        @Override
        protected void onDraw(Canvas canvas) {
            // TODO Auto-generated method stub
            super.onDraw(canvas);
            drawRotateImage(canvas);
            canvas.drawPoint(Position.x_axis, Position.y_axis, paint);

            Path path = new Path();
            path.moveTo(lastX, lastY);
            path.lineTo(lineX,lineY);
            canvas.drawPath(path, paint);
        }

        private void stepDetector (float step) {
            stepCount += (int) step;
            distance = stepCount * 30;
            lineX = (float) (lineX + 30);
            lineY = (float) (lineY + 30);
            invalidate();
            lastX = lineX;
            lastY = lineY;
        }
}

每次检测到一个步骤时都会调用stepdetector,它应该重新绘制画布以显示移动。注意到前面的运动线需要是可见的,也就是说它应该是一条连续的线。
我在获取导航线路路径时遇到问题。如果我能在这方面得到一些帮助,我将不胜感激。
先谢谢你。

0s7z1bwu

0s7z1bwu1#

试试这个,列一个列表,每一步都加点,然后在ondraw中从列表中画出所有的点

class CanvasView extends View {
        List<Point> points;
        private Paint paint = new Paint();
        private Path path = new Path();
        private float lineX = Position.x_axis;
        private float lineY = Position.y_axis;
        private float lastX = Position.x_axis;
        private float lastY = Position.y_axis;

        public CanvasView(Context context) {
            super(context);
            paint.setAntiAlias(true);
            paint.setStrokeWidth(10f);
            paint.setColor(Color.BLACK);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeJoin(Paint.Join.ROUND);
            points=new ArrayList<>();

        }

        @Override
        protected void onDraw(Canvas canvas) {
            // TODO Auto-generated method stub
            super.onDraw(canvas);
            drawRotateImage(canvas);
            canvas.drawPoint(Position.x_axis, Position.y_axis, paint);
            // now here draw all points from list
            Path path = new Path();
            path.moveTo(lastX, lastY);
            path.lineTo(lineX,lineY);
            canvas.drawPath(path, paint);
        }

        private void stepDetector (float step) {
            stepCount += (int) step;
            distance = stepCount * 30;
            lineX = (float) (lineX + 30);
            lineY = (float) (lineY + 30);
            invalidate();
            lastX = lineX;
            lastY = lineY;
            // add every point to the list after step
        }

class Point{
float x,y;

}

}
t5zmwmid

t5zmwmid2#

这个 onDraw 每次都绘制内容的新副本,并且不保留旧信息。对于要绘制的内容,可以保留一个类型列表 Position 并在 stepDetector 被称为。
然后,在里面 onDraw ,遍历列表并绘制连接列表中所有点的线。

相关问题