Как рисовать разные точки с помощью canvas в Android

#java #android #canvas

#java #Android #холст

Вопрос:

Я разрабатываю приложение для Android, мне нужно реализовать функцию, которая позволяет мне рисовать разные точки в activity.

Это мой код:

 public class MainActivity extends AppCompatActivity {
    public Paint paint;
    public List<Point> coords;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new DrawingView(this));

        paint = new Paint();
        coords = new ArrayList();

        ImageView iv = new ImageView(getApplicationContext());
        iv.setImageResource(R.drawable.car);
        iv.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
        LinearLayout.LayoutParams parms = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
        iv.setLayoutParams(parms);
    }

    class DrawingView extends SurfaceView {

        private final SurfaceHolder surfaceHolder;
        private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

        public DrawingView(Context context) {
            super(context);
            surfaceHolder = getHolder();
            paint.setColor(Color.BLACK);
            paint.setStyle(Paint.Style.FILL);
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            if(event.getAction() == MotionEvent.ACTION_DOWN) {
              addpoint(event.getX(), event.getY());
            }
            return false;
        }

        public void addpoint(float x, float y){

            Point point = new Point();
            point.x = Math.round(x);
            point.y = Math.round(y);
            coords.add(point);

            for(int i = 0; i< coords.size(); i  ) {
                Canvas canvas = surfaceHolder.lockCanvas();
                canvas.drawColor(Color.WHITE);
                canvas.drawCircle(coords.get(i).x, coords.get(i).y, 20, paint);
                surfaceHolder.unlockCanvasAndPost(canvas);
            }
        }
    }
}
  

Каждый раз, когда я касаюсь экрана, я получаю и сохраняю координаты в списке, затем я пытаюсь нарисовать список точек, но на экране остается только одна точка, я не понимаю почему.

Итак, как я могу нарисовать другую точку на экране (и сохранить ее)?

Другой вопрос: как я могу показать фоновое изображение?

Ответ №1:

Из официальных Javadocs:

drawColor(int color) Заполните все растровое изображение холста (ограниченное текущим клипом) указанным цветом, используя режим srcover porterduff.

Итак, каждый раз, когда вы рисуете круг, сначала вы очищаете весь холст белым цветом. Итак, после рисования нарисованный ранее круг очищается.

Итак, один из вариантов — сохранить текущее состояние фона и всегда рисовать его поверх белого, или попробуйте не использовать drawColor

Комментарии:

1. Хорошо, еще одна проблема: когда я рисую точку, если я поворачиваю свой телефон, ориентация меняется, и точка исчезает, как я могу сохранить точку?

2. Ну, мой ответ решил вашу проблему? Не могли бы вы принять это? Затем создайте другой вопрос для другой проблемы, пожалуйста, и я постараюсь ответить на него.

3. Я решил эту проблему в одной части, удалив строку, относящуюся к drawcolor, теперь появляется больше точек, но не все..

Ответ №2:

 for(int i = 0; i< coords.size(); i  ) {
      Canvas canvas = surfaceHolder.lockCanvas();
      canvas.drawColor(Color.WHITE);
      canvas.drawCircle(coords.get(i).x, coords.get(i).y, 20, paint);
      surfaceHolder.unlockCanvasAndPost(canvas);
}
  

должно быть

 Canvas canvas = surfaceHolder.lockCanvas();
canvas.drawColor(Color.WHITE);
for(int i = 0; i< coords.size(); i  ) {
          canvas.drawCircle(coords.get(i).x, coords.get(i).y, 20, paint);
}
surfaceHolder.unlockCanvasAndPost(canvas);
  

canvas.drawColor(Color.WHITE); Каждый раз стирается весь холст и surfaceHolder.unlockCanvasAndPost(canvas); отображается только последний добавленный круг