簡體   English   中英

在Android的onTouchEvent上更改畫布顏色

[英]Change canvas color onTouchEvent Android

我正在嘗試創建一個活動,當您點擊畫布時,畫布的顏色會發生變化。

使用現在的代碼,我得到此錯誤:

嘗試在null對象引用上調用虛擬方法'void android.graphics.Canvas.drawRect(float,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 ,這些Canvas將從onTouchEvent設置的實例值中onTouchEvent

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM