2015-07-02 7 views
0

Я пытаюсь сделать операцию, в которой изменяется цвет холста при нажатии на холст.Изменить цвет холста onTouchEvent Android

С кодом Теперь у меня есть, я получаю эту ошибку:

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

Это часть моего кода деятельности.

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


    } 

Что я делаю неправильно?

ответ

1

Я думаю, что знаю, в чем проблема. Недействительный вызов снова к методу 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); 
    } 


} 
+0

Это он! Спасибо! – user3182261

0

Ваш Canvas - null. Вы получите его только в onDraw(Canvas canvas), который отвечает за рисование на вашем Canvas. В вашем onTouchEvent установите некоторые переменные экземпляра (например, цвет, позиции и т. Д.) И вызовите invalidate(), затем будет активирован onDraw, и вы можете нарисовать Canvas с нужными запросами, которые вы получите от значений экземпляров, установленных вами в onTouchEvent.

Смежные вопросы