2011-12-03 26 views
0

好吧,所以我試圖從onDraw方法之外繪製到Android上的畫布。onDraw方法之外的Android圖形

這只是最簡單的展示我的代碼:

public class TestActivity extends Activity { 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Paint p = new Paint(); 
    p.setColor(Color.GREEN); 
    Panel a = new Panel(this,150,150,50,p); 
    a.drawThing(); 
    setContentView(a); 

} 
class Panel extends View{ 
    private float radius, x, y; 
    private Canvas CAN; 
    private Paint p; 
    public Panel(Context context, float x, float y, float radius, Paint p){ 
     super(context); 
     this.x = x; 
     this.y = y; 
     this.radius = radius; 
     this.p = p; 

    } 
    @Override 
    public void onDraw(Canvas canvas){ 
     super.onDraw(canvas); 
     CAN = canvas; 

    } 

    public void drawThing(){ 
     CAN.drawCircle(x, y, radius, p); 
    } 
} 
} 

你明白我想要做什麼?但由於某些原因,它拋出一個NullPointerException

回答

4

許多圖形資源被明確釋放/已經習慣後,他們釋放。我不確定他們爲什麼這樣做,但不管什麼原因,他們不會去做你想做的事。

代替的onDraw方法之外繪製的,使用某種標誌的改變什麼的onDraw方法做。當你想畫一些特定的東西時,你可以設置正確的標誌,並致電invalidate()

@Override 
public void onDraw(Canvas canvas){ 
    super.onDraw(canvas); 
    if (doThing) { 
     canvas.drawCircle(x, y, radius, p); 
    } 
} 

編輯
別的東西要考慮的是繪製和 「非scrren」 源。這意味着使用某種圖形表示(如位圖)作爲可以在其他代碼中繪製的緩衝區。這不會更新你的GUI,但它會讓你有機會做一些重型繪圖而不鎖定用戶的設備。一旦你完成繪製位圖(或其他),你可以使你的視圖無效並將其繪製到onDraw(Canvas)方法中的屏幕上。

+0

謝謝。畫外屏是我如何做到的。但是我仍然不知道應該如何以及在哪裏調用invalidate。 – SMUsamaShah

+0

invalidate應該在代碼中的任何地方被調用,您知道屏幕上的信息不再正確,並且您的視圖需要重繪。因此,如果您正在製作某種數據視圖,則可以在數據更改時使其無效。如果您正在製作遊戲,則可以在遊戲循環的每次迭代中都使其失效。到底什麼時候這取決於你想要做什麼。 – mtmurdock

1

我敢肯定的是,空指針是因爲你打電話你畫我猜的onDraw曾經被調用之前。所以CAN是空的。