Как нарисовать круги на разных позициях, используя onTouchEven () в android? - PullRequest
1 голос
/ 10 апреля 2020

Я пытаюсь нарисовать круги в точке, где пользователь касается. Я использую onTouchEvent (), чтобы получить координаты xy касания. Следующий код добавляет круг в правом углу экрана. Но когда я использую invalidate () функция перед 'break;' В операторе onTouchEvent () появляется круг, но когда я касаюсь другой позиции, предыдущий круг стирается, и в новой точке касания рисуется новый круг. Как я могу изменить этот код так, чтобы в каждом ACTION_DOWN onTouchEvent () в этой точке рисовался круг, а ранее нарисованный круг также не стирался.

public class TestView3 extends View {

    private static final String TAG = "TestView3";
    Paint paint = new Paint();
    float mX,mY;

    public TestView3(Context context, AttributeSet attributeSet){
        super(context);
        Log.d(TAG, "TestView3: constructor called");
        paint.setColor(Color.BLACK);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Log.d(TAG, "onDraw: called");
        //canvas.drawLine(0,0,20,20,paint);
        //canvas.drawLine(20,0,0,20,paint);
        canvas.drawCircle(mX,mY,10,paint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        float x = event.getX();
        float y = event.getY();

        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                Log.d(TAG, "onTouchEvent: Action_down happend");
                mX = x;
                mY = y;

                break;
        }
        return true;

    }
}

1 Ответ

0 голосов
/ 10 апреля 2020

Вы должны сохранить свои круги в списке и нарисовать каждый из них методом onDraw.

Следующий отредактированный код работал для меня.

public class TestView3 extends View {

    private static final String TAG = "TestView3";
    Paint paint = new Paint();
    float mX,mY;
    Bitmap mBitmap;
    Canvas mCanvas;

    ArrayList<Point> arrayList = new ArrayList<>();

    public TestView3(Context context, AttributeSet attributeSet){
        super(context);
        Log.d(TAG, "TestView3: constructor called");
        paint.setColor(Color.BLACK);


    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Log.d(TAG, "onDraw: called");
        //canvas.drawLine(0,0,20,20,paint);
        //canvas.drawLine(20,0,0,20,paint);
        for(int i = 0;i < arrayList.size();i++){
            Point point = arrayList.get(i);
            canvas.drawCircle(point.x,point.y,10,paint);


            // Draw line with next point (if it exists)
            if (i + 1 < arrayList.size()) {
                Point next = arrayList.get(i + 1);
                canvas.drawLine(point.x, point.y, next.x, next.y, paint);
            }
        }
       // canvas.drawCircle(mX,mY,10,paint);
    }

/*    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

        mBitmap = Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888);
        mCanvas = new Canvas(mBitmap);

    }*/

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        float x = event.getX();
        float y = event.getY();

        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                Log.d(TAG, "onTouchEvent: Action_down happend");

                mX = x;
                mY = y;
                arrayList.add(new Point((int)x,(int)y));
                invalidate();
                break;
        }
        return true;

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...