2012-09-28 176 views
3

我製作了一個自定義的視圖,它是從xml佈局引用的。我添加了一個用於清除視圖的按鈕。現在我想在點擊時清除畫布區域。我在xml佈局文件中添加了一個onClick事件。現在我怎麼添加清除整個視圖/畫布的代碼?我剛剛添加了部分代碼。 (這沒有清除任何東西)。我按照以下順序添加了我的活動,視圖和佈局文件。清除畫布區域

public class CustomViewActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

    } 

    public void clearLine(View v) { 

    new CustomView(CustomViewActivity.this, null).clearCanvas();   
    } 

} 

public class CustomView extends View { 

    private Paint paint = new Paint(); 
     private Path path = new Path(); 
     public Boolean clearCanvas = false; 

     public CustomView(Context context, AttributeSet attrs, int defStyle) { 
      super(context, attrs, defStyle);   
     } 

    public CustomView(Context context,AttributeSet attrs) { 
     super(context,attrs); 
     paint.setAntiAlias(true); 
     paint.setColor(Color.BLUE); 
     paint.setTextSize(20); 
     paint.setStyle(Paint.Style.STROKE); 
     paint.setStrokeJoin(Paint.Join.ROUND); 
     paint.setStrokeWidth(5f); 
    } 

    protected void onDraw(Canvas canvas) { 
    if(clearCanvas) 
     { // Choose the colour you want to clear with. 
      canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); 
      //canvas.drawColor(0, Mode.CLEAR); 
      clearCanvas = false;    
     } 

     super.onDraw(canvas); 
     canvas.drawText("Hello World", 5, 30, paint); 
     canvas.drawPath(path, paint); 

    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 

    //int action = event.getAction() & MotionEvent.ACTION_MASK; 

     float eventX = event.getX(); 
     float eventY = event.getY(); 

     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
      path.moveTo(eventX, eventY); 

      return true; 
      case MotionEvent.ACTION_MOVE: 
      path.lineTo(eventX, eventY); 
      break; 
      case MotionEvent.ACTION_UP: 
      // nothing to do 
      break; 
      default: 
      return false; 
     } 

     // Schedules a repaint. 
     invalidate(); 
     return true; 

    } 
    public void clearCanvas(){ 

      clearCanvas = true; 
      postInvalidate(); 
      //canvas.drawColor(0, Mode.CLEAR); 

     } 

} 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 


      <com.example.CustomViewEvent.CustomView 
       android:id="@+id/customView" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" /> 

      <Button 
       android:id="@+id/button1" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignParentBottom="true" 
       android:layout_centerHorizontal="true" 
       android:layout_marginBottom="28dp" 
       android:onClick="clearLine" 
       android:text="CLEAR" /> 

</RelativeLayout> 
+0

drawColor對我來說似乎是個好開始 – njzk2

回答

5

您需要做的是訪問onDraw方法中的畫布。

因此,如果您使用全局變量,請在您的按鈕單擊方法中將其設置爲true。在OnDraw中,您可以檢查其狀態並在必要時清除畫布。 (然後將它設置爲false,以便它不會每次都這樣做)。

查看下面的代碼的使用情況。

public Boolean clearCanvas = false; 

protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     if(clearCanvas) 
     { // Choose the colour you want to clear with. 
      canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); 
      clearCanvas = false; 
     } 
     canvas.drawPath(path, paint);  
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 

    float eventX = event.getX(); 
     float eventY = event.getY(); 

     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
      path.moveTo(eventX, eventY); 

      return true; 
      case MotionEvent.ACTION_MOVE: 
      path.lineTo(eventX, eventY); 
      break; 
      case MotionEvent.ACTION_UP: 
      // nothing to do 
      break; 
      default: 
      return false; 
     } 

     // Schedules a repaint. 
     invalidate(); 
     return true; 

    } 
// this is the method which will be invoked from main activity class for clearing whatever //is in the view/canvas 
     public void clearCanvas(){ 

      //canvas.drawColor(0, Mode.CLEAR); 

      clearCanvas = true; 
      invalidate(); 
     } 

} 

編輯: 看你的新代碼,我看到了一些問題。

我認爲這反過來說明你並未清除正確的觀點。

首先,獲取現有視圖的實例。然後你可以清除它。而不是錯誤的不存在的實例。

CustomView cv = (CustomView)findViewById(R.id.customView); 
cv.clearCanvas(); 

嘗試invalidate();其他postInvalidate();人們應該工作。

postInvalidate()適用於當您在非UI線程上運行時。

+0

PorterDuff.Mode.CLEAR中的PorterDuff;給出了一個錯誤。這是什麼PorterDuff。 – Tanvir

+0

我通過這個新的CustomView(CustomViewActivity.this,null).clearCanvas()從activity的onclik方法調用了method-clearCanvas();即使在調用invalidate()時,它甚至不會再調用onDraw()。 \t \t } – Tanvir

+0

你可以試試'postInvalidate()'。如果它的有效,只使用'Mode.CLEAR'。我不知道你的結構是什麼樣的,但我的'onDraw'在遊戲循環中被調用。無效無效的事實是另一個問題。你可能會得到更好的答案,打開一個新的。 – Doomsknight