这可能不是最好的做法,但它似乎是最简单的。我需要将一个位图传递给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方法。
答案 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。
祝你好运。