2011-12-03 16 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); 
    } 
} 

EDIT
考慮すべき他のものに描き、 "オフscrren" ソースされます。これは、ビットマップのようなグラフィックス表現を、他のコードで描画できるバッファとして使用することを意味します。これでguiは更新されませんが、ユーザーのデバイスをロックせずに大胆な描画を行うチャンスが与えられます。ビットマップに描画したら(または何でも)、ビューを無効にしてonDraw(Canvas)メソッドで画面に描画できます。

+0

ありがとうございました。私はそれをオフスクリーンで描いています。しかし、私はまだ無効と呼ばれるべき方法と場所を知らないのですか? – SMUsamaShah

+0

無効化は、画面上の情報が正しくなくなり、ビューを再描画する必要があることが分かっているコードのどこでも呼び出されるはずです。したがって、ある種のデータビューを作成している場合は、データが変更されたときに無効にすることができます。ゲームを作っている場合は、ゲームループの繰り返しごとに1回無効にすることができます。正確にこれがあなたがしようとしていることに依存します。 – mtmurdock

1

あなたはonDrawが呼び出される前にdrawSomethingを呼び出しているので、nullポインタが発生することは間違いありません。したがって、CANはnullです。

関連する問題