1

假设我有 3 节课。

  • A 类(扩展活动)
    B
    类 C 类(扩展视图)

A 创建一个包含 的 B 对象Bitmap。A 也使 C 无效。ConDraw将 a 绘制Bitmap到它的Canvas.

如何绘制BitmapB 持有的而不Bitmap在 C 中创建另一个对象?请注意,保持相同的“类结构”对我来说很重要。

这是伪代码。您可以看到这会将 2 个Bitmap对象放入内存中。谢谢!

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不是原始的,它就不会。

在您的代码中,存在第二个副本的唯一方法是您new有意创建一个新对象。

比如在课堂上C

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

如果你按照你所做的那样做:

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

...然后 Abbitmap 和 C.bitmap 将引用内存中的相同对象。

如果这是 C++,那么您有一个有效的担忧 - 但在 Java 中,您所做的并不会复制正在传递的对象。

高温高压

于 2011-02-20T23:30:36.760 回答