2011-04-29 154 views
2

这可能不是最佳实践,但它似乎是最简单的。我需要传递一个位图到一个SurfaceView,所以它调用onDraw。但我似乎无法弄清楚它的分配时的语法。请注意构造函数中的额外位图。通过构造函数将参数传递给SurfaceView

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()”的例子。其基本目标是在曲面视图中显示位图。基于我的谷歌搜索你不能访问画布以外的onDraw,所以我需要通过它时,它的init(我认为)。当我设置var“mSampleView”或使用setContentView()调用布局时,我也不确定构造函数是否被调用。如果后者都是静音,并让我想知道是否有方法访问画布或定位主要活动。如果我可以定位主要活动,我可以在需要时访问它,但是我没有很好地理解android/java中的范围。

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

+1

据我所知,你不能这样做。它不受继承类的支持。 – user432209 2011-04-29 16:56:03

回答

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); 
} 

只要您修改传递到SampleView类对象b,然后验证来看,onDraw方法将使用新的对象,因为myReferencedBitmap持有对(对象)值的引用。

另一个需要注意的地方是Java中的byref vs byval。

祝你好运。

+0

谢谢,我已经读了一些,我应该一直使用ImageView。但即时通讯无论如何都需要这个预览。谢谢你的帮助。 – 2011-04-29 17:12:55

相关问题