在触摸事件安卓上更改画布颜色



我正在尝试制作一个活动,当您点击画布时,画布颜色会发生变化。

使用我现在拥有的代码,我收到此错误:

尝试在空对象引用上调用虚拟方法"void android.graphics.Canvas.drawRect(float, float, float, float, android.graphics.Paint(">

这是我的活动代码的一部分。

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);
        }

    }

我做错了什么?

我想

我知道你的问题是什么。再次使对 onDraw(( 方法的调用无效,它会覆盖您在 onTouchEvent 方法中绘制的任何内容。

请尝试以下代码:

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);
    }

}

您的Canvas为空。你只会把它放在负责在你的Canvas onDraw(Canvas canvas)里面。在您的onTouchEvent中,设置一些实例变量(例如颜色,位置等(并调用invalidate(),然后onDraw将被触发,您可以根据需要绘制Canvas,您将从onTouchEvent中设置的实例值中获得。

最新更新