通过Constructor将参数传递给SurfaceView

时间:2011-04-29 16:24:45

标签: android

这可能不是最好的做法,但它似乎是最简单的。我需要将一个位图传递给SurfaceView,以便调用onDraw。但我似乎无法弄清楚何时分配它的语法。注意构造函数中的额外位图。

public class SampleView extends SurfaceView implements SurfaceHolder.Callback {

SurfaceHolder holder;
Bitmap mBitmap = null;

public SampleView (Context context, AttributeSet attrs, Bitmap bitmap) {
    super(context, attrs);
    if(bitmap != null)
        mBitmap = bitmap

    SurfaceHolder holder = getHolder();
    holder.addCallback(this);
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
protected void onDraw(Canvas canvas) {
    Paint paint = new Paint();
    paint.setFilterBitmap(true);
    double aspectRatio = ((double) mBitmap.getWidth()) / mBitmap.getHeight();
    Rect dest = new Rect(0, 0, this.getWidth(),(int) (this.getHeight() / aspectRatio));
    canvas.drawBitmap(mBitmap, null, dest, paint);
}

然后我正在尝试分配它,但我不知道如何设置视图并传递位图

setContentView(R.layout.sample); //has my custom view
mSampleView = (SampleView) findViewById(R.id.sampleView);

这可能是我不了解你可以初始化视图的方式。我见过使用“addview()”的例子。其基本目标是在surfaceview中显示位图。根据我的谷歌搜索你不能访问除了onDraw之外的画布所以我需要在它的init(我认为)时传递它。当我设置var“mSampleView”或使用setContentView()来调用布局时,我也不确定是否调用了构造函数。如果它的后者全部静音,让我想知道是否有办法访问画布或目标主要活动。如果我可以定位主要活动,我可以在需要时访问它,但我对android / java中的范围没有很好的把握。

以这种方式传递数据是不好的做法?除了全局数据存储之外,还有更标准的passdata方法。

1 个答案:

答案 0 :(得分:2)

更多地澄清我的注释......当其继承的类在构造函数调用中不支持该对象时,不能将另一个对象直接传递给类的构造函数。

之后,您必须在另一个方法调用中通过值传递位图,或者通过传递对象的引用。

你对onDraw方法使用它所使用的对象的方式非常困惑。我知道,因为我第一次也无法理解它。

以下是您可以做的事情的示例。

首先构造视图并为视图提供位图

private Bitmap myReferencedBitmap;

public SampleView (Context context, AttributeSet attrs) {
     super(context, attrs);
} 

现在传入你想要使用的位图对象。

public fooBitmap(Bitmap b) {
     myReferencedBitmap = b;
}

现在使用onDraw和引用的位图

protected void onDraw(Canvas canvas) {  
   canvas.drawBitmap(myReferencedBitmap, null, null, paint);
}

现在每当您修改传递到b类的对象SampleView,然后使视图无效时,onDraw方法将使用新对象,因为{{1}保存对(对象)值的引用。

要看的另一件事是Java中的byref vs byval。

祝你好运。