1

3つのクラスがあるとしましょう。

  • クラスA(アクティビティを拡張)
    クラスB
    クラスC(ビューを拡張)

Aは、を保持するBオブジェクトを作成しますBitmap。AはCも無効にします。CはそのにonDrawaを描画します。BitmapCanvas

Cで別のオブジェクトBitmapを作成せずに、Bが保持するを描画するにはどうすればよいですか?Bitmap同じ「クラス構造」を維持することが重要であることに注意してください。

これが擬似コードです。Bitmapこれにより、2つのオブジェクトがメモリに配置されることがわかります。ありがとう!

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

        B b = new B();
        C c = (C) findViewById(R.id.c);

        c.passTheBitmap(b.bitmap);
        c.postInvalidate();
    }       
}

public class B {
    public Bitmap bitmap;
    public B(){
        bitmap = BitmapFactory.decodeResource(ActivityAContext.getResources(), R.drawable.fooBitmap);
    }
}

public class C extends View {
    public Bitmap bitmap;

    public C(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public passTheBitmap(Bitmap b) {
        bitmap = b;
    }
    @Override
    public void onDraw(Canvas canvas) {
        if (bitmap != null) {
            canvas.drawBitmap(bitmap, 0, 0, null);
        }
    }
}
4

2 に答える 2

3

インスタンス変数を C で宣言することによって、C で Bitmap オブジェクトを正確に複製しているわけではありません。B のコンストラクターで作成された元の Bitmap オブジェクトへの別の参照を持っているだけです。

于 2011-02-20T21:31:51.893 に答える
1

次の行だと思うと思います:

c.passTheBitmap(b.bitmap);

b.bitmapコピーされる原因になります。b.bitmapがプリミティブでない限り、そうではありません。

コードで 2 番目のコピーを作成する唯一の方法は、使用newして新しいオブジェクトを意図的に作成する場合です。

例:授業中C

public passTheBitmap(Bitmap b) {
    bitmap = new Bitmap(b);
}

あなたがしたようにすれば:

public passTheBitmap(Bitmap b) {
    bitmap = b;
}

... 次に、Abbitmap と C.bitmap はメモリ内の同じオブジェクトを参照します。

これが C++ の場合は、妥当な懸念がありますが、Java では、渡されたオブジェクトのコピーが作成されません。

HTH

于 2011-02-20T23:30:36.760 に答える