2012-04-26 57 views
0

我試圖使我的畫布無效,當我點擊一個按鈕。我有一個按鈕佈局,我有一個畫布視圖。當我點擊一個按鈕時,圓圈應該隱藏或顯示。在現在的代碼中,我只能使我的畫布無效一次。當我第一次按下按鈕時,它會工作。但是,當我第二次按下它不起作用。例如:如果我按隱藏,然後顯示它的作品。但是當我再次按下隱藏按鈕時,它不起作用。當我點擊一個按鈕時,我希望CanvasView每次都失效。不僅是第一次。使點擊按鈕上的畫布無效?

public class CanvasWithButtonsActivity extends Activity { 
    boolean showCircle = true; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(layout()); 

     findViewById(R.id.buttonHide).setOnClickListener(
       new OnClickListener() {  
       public void onClick(View v) { 
        //HIDE 
        showCircle = false; 
        //How do i invalidate my canvas from here? 
        CanvasView cv = new CanvasView(getApplicationContext()); 
         cv.invalidate(); 
       } 
     }); 

     findViewById(R.id.buttonShow).setOnClickListener(
       new OnClickListener() {  
       public void onClick(View v) { 
        //SHOW 
        showCircle = true; 
        //How do i invalidate my canvas from here? 
        CanvasView cv = new CanvasView(getApplicationContext()); 
         cv.invalidate(); 
       } 
     }); 
    } 

    public RelativeLayout layout(){ 
     RelativeLayout mainLayout = new RelativeLayout(this); 
     mainLayout.setLayoutParams(new LinearLayout.LayoutParams(
       LinearLayout.LayoutParams.FILL_PARENT, 
       LinearLayout.LayoutParams.FILL_PARENT, 1)); 
     mainLayout.setBackgroundColor(Color.WHITE); 

     View buttonLayout = LayoutInflater.from(getBaseContext()).inflate(R.layout.main, null); 
     buttonLayout.setLayoutParams(new LinearLayout.LayoutParams(
       LinearLayout.LayoutParams.FILL_PARENT, 
       LinearLayout.LayoutParams.FILL_PARENT, 1)); 
     CanvasView cv = new CanvasView(getApplicationContext()); 
     mainLayout.addView(cv); 
     mainLayout.addView(buttonLayout); 

     return mainLayout; 
    } 

    private class CanvasView extends View{ 

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

     protected void onDraw(Canvas myCanvas){ 
      Paint myPaint = new Paint(); 
      myPaint.setColor(Color.BLUE); 
      if(showCircle == true) 
       myCanvas.drawCircle(myCanvas.getWidth()/2, 100, 20, myPaint); 
     } 
    } 
} 

如果有人有這個問題的解決方案,它會解決我的許多問題。

回答

2

你似乎在你的按鈕處理程序要創建一個新的畫布視圖實例

CanvasView cv = new CanvasView(getApplicationContext()); 
cv.invalidate(); 

你可能要保持對它的引用,不是嗎?

編輯: 在你的layout()方法中你創建了一個視圖實例。 cv這裏是對它的引用。它是本地的你的方法:

CanvasView cv = new CanvasView(getApplicationContext()); 
mainLayout.addView(cv); 
mainLayout.addView(buttonLayout); 

你想使它成爲全球(即類字段)。基本上是一個Java實例變量(比如你的布爾「showCircle」標誌)。您可以從偵聽器代碼中使用它,就像更改布爾「showCircle」標誌的方式一樣。

另外,我建議閱讀更多關於使用XML創建佈局和使用findViewById方法查找視圖的信息。

編輯2:如果你的實例變量你的代碼看起來像這樣。 (我在記事本中輸入的可能的錯誤):

public class CanvasWithButtonsActivity extends Activity { 
    boolean showCircle = true; 
    private CanvasView mCanvasView; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(layout()); 

     findViewById(R.id.buttonHide).setOnClickListener(
       new OnClickListener() {  
       public void onClick(View v) { 
        //HIDE 
        showCircle = false; 
        //How do i invalidate my canvas from here? 
        if (mCanvasView != null) { 
         mCanvasView.invalidate(); 
        } 
       } 
     }); 

     findViewById(R.id.buttonShow).setOnClickListener(
       new OnClickListener() {  
       public void onClick(View v) { 
        //SHOW 
        showCircle = true; 
        //How do i invalidate my canvas from here? 
        if (mCanvasView != null) { 
         mCanvasView.invalidate(); 
        } 
       } 
     }); 
    } 

    public RelativeLayout layout(){ 
     RelativeLayout mainLayout = new RelativeLayout(this); 
     mainLayout.setLayoutParams(new LinearLayout.LayoutParams(
       LinearLayout.LayoutParams.FILL_PARENT, 
       LinearLayout.LayoutParams.FILL_PARENT, 1)); 
     mainLayout.setBackgroundColor(Color.WHITE); 

     View buttonLayout = LayoutInflater.from(getBaseContext()).inflate(R.layout.main, null); 
     buttonLayout.setLayoutParams(new LinearLayout.LayoutParams(
       LinearLayout.LayoutParams.FILL_PARENT, 
       LinearLayout.LayoutParams.FILL_PARENT, 1)); 
     mCanvasView = new CanvasView(getApplicationContext()); 
     mainLayout.addView(mCanvasView); 
     mainLayout.addView(buttonLayout); 

     return mainLayout; 
    } 

    private class CanvasView extends View{ 

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

     protected void onDraw(Canvas myCanvas){ 
      Paint myPaint = new Paint(); 
      myPaint.setColor(Color.BLUE); 
      if(showCircle == true) 
       myCanvas.drawCircle(myCanvas.getWidth()/2, 100, 20, myPaint); 
     } 
    } 
} 
+0

我不是很擅長編程。保留參考意味着什麼?我如何保留參考? – greenPostIt 2012-04-26 12:24:16

+0

我已編輯包含更多詳細信息 – EvilDuck 2012-04-26 12:58:20

+0

如果我明白我應該讓CanvasView cv變成全局變量。當我移動CanvasView cv = new CV(getA());在showCircle布爾下應用程序崩潰。我如何做一個CanvasView的全局實例而不會崩潰? – greenPostIt 2012-04-26 13:32:00