user3182261
user3182261

Reputation: 271

Change canvas color onTouchEvent Android

I'm trying to make an Activity in which the canvas color changes when you tap the canvas.

With the code I now have, I get this error:

Attempt to invoke virtual method 'void android.graphics.Canvas.drawRect(float, float, float, float, android.graphics.Paint)' on a null object reference

This is a part of my Activity code.

public class ColorActivity extends Activity  {

    private float x = 0;
    private float y = 0;

    public Canvas canvas;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_color);

        setContentView(new MyView(this));
    }

    public class MyView extends View {

        public MyView(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
            setFocusableInTouchMode(true);
        }

        @Override
        protected void onDraw(Canvas canvas) {

            super.onDraw(canvas);
            int x = getWidth();
            int y = getHeight();

            Paint paintCanvas = new Paint();
            paintCanvas.setStyle(Paint.Style.FILL);
            paintCanvas.setColor(Color.WHITE);
            paintCanvas.setColor(Color.parseColor("#F44336"));
            canvas.drawRect(0, 0, x, y, paintCanvas);
        }

        public boolean onTouchEvent(MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:

                    Paint repaintCanvas = new Paint();
                    repaintCanvas.setStyle(Paint.Style.FILL);
                    repaintCanvas.setColor(Color.WHITE);
                    repaintCanvas.setColor(Color.parseColor("#2196F3"));
                    canvas.drawRect(0, 0, 100, 100, repaintCanvas);

                    invalidate();
                    break;
                case MotionEvent.ACTION_MOVE:
                    Log.d("LOG","Move");
                    invalidate();
                    break;
                case MotionEvent.ACTION_UP:
                    Log.d("LOG", "Up");
                    invalidate();
                    break;
            }
            return super.onTouchEvent(event);
        }


    }

What am I doing wrong?

Upvotes: 0

Views: 695

Answers (2)

I think I know what is your problem. Invalidate calls again to the onDraw() method and it overwrites whatever you paint in the onTouchEvent method.

Try the following code:

public class ColorActivity extends Activity  {

private float x = 0;
private float y = 0;

public Canvas canvas;




@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_color);

    setContentView(new MyView(this));


}

public class MyView extends View {

    Paint paintCanvas;

    public MyView(Context context) {
        super(context);
        paintCanvas = new Paint();
        paintCanvas.setStyle(Paint.Style.FILL);
        paintCanvas.setColor(Color.WHITE);
        paintCanvas.setColor(Color.parseColor("#F44336"));
        // TODO Auto-generated constructor stub
        setFocusableInTouchMode(true);
    }

    @Override
    protected void onDraw(Canvas canvas) {

        super.onDraw(canvas);
        int x = getWidth();
        int y = getHeight();


        canvas.drawRect(0, 0, x, y, paintCanvas);
    }

    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:


                paintCanvas.setStyle(Paint.Style.FILL);
                paintCanvas.setColor(Color.WHITE);
                paintCanvas.setColor(Color.parseColor("#2196F3"));

                invalidate();
                break;
            case MotionEvent.ACTION_MOVE:
                Log.d("LOG","Move");
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
                Log.d("LOG", "Up");
                invalidate();
                break;
        }
        return super.onTouchEvent(event);
    }


}

Upvotes: 1

Carnal
Carnal

Reputation: 22064

Your Canvas is null. You will only get it inside onDraw(Canvas canvas) which is responsible for drawing on your Canvas. In your onTouchEvent, set some instance variables (such as color, positions etc.) and call invalidate(), then onDraw will be triggered and you can draw your Canvas with desired needs which you will get from the instance values you set in onTouchEvent.

Upvotes: 0

Related Questions