【问题标题】:Passing arguments to SurfaceView via Constructor通过构造函数将参数传递给 SurfaceView
【发布时间】:2011-04-29 16:24:44
【问题描述】:

这可能不是最好的做法,但它似乎是最简单的。我需要将位图传递给 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()”的例子。其基本目标是在表面视图中显示位图。根据我的谷歌搜索,您无法访问除 onDraw 之外的画布,因此我需要在其初始化时将其传递(我认为)。我也不确定在设置 var "mSampleView" 或使用 setContentView() 调用布局时是否调用了构造函数。如果是后者,那么这一切都让我想知道是否有办法访问画布或定位主要活动。如果我可以针对主要活动,我可以在需要时访问它,但我对 android/java 的范围没有很好的掌握。

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

【问题讨论】:

  • 据我所知,你不能那样做。继承的类不支持。

标签: android


【解决方案1】:

为了进一步澄清我的评论...当继承的类在构造函数调用中不支持该对象时,您不能将另一个对象直接传递给类的构造函数。

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

您对 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 与 byval。

祝你好运。

【讨论】:

  • 谢谢,我要阅读更多内容,无论如何我应该一直使用 ImageView。但无论如何我都需要这个来进行相机预览。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-19
  • 1970-01-01
  • 2023-04-04
相关资源
最近更新 更多