1

我已经实现了许多类似的活动,但由于某种原因,下面的类没有达到 onDraw 调用。(非常简单的)类:

import ...etc.


public class SVPlay extends SurfaceView implements Callback {
Context context;
Point screenSize;
    Bitmap backGroundImage
public SVPlay(Context _context) {
    super(_context);
    context = _context;
    this.getHolder().addCallback(this);
    setFocusable(true);
    screenSize = DrawUtil.getInstance(context).getScreenSize();
    backgroundImage =  BitmapFactory.decodeResource(context.getResources(), R.drawable.room);
    backgroundImage = Bitmap.createScaledBitmap(backgroundImage, screenSize.x, screenSize.y, false);


}


@Override    public boolean onTouchEvent(MotionEvent event) {
    ...
}


@Override
protected void onDraw(Canvas canvas) {
    canvas.drawColor(0xFFAAAAAA);
    canvas.drawBitmap(backgroundImage, 0, 0, paint);

}



public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    // TODO Auto-generated method stub

}
public void surfaceCreated(SurfaceHolder holder) {
    setWillNotDraw(false);

}
public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub

}

}

此类由活动实例化并运行: public class PlayActivity extends Activity {

SVPlay svPlay;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    svPlay = new SVPlay(this);
    setContentView(svPlay);
}
....
}

这类似于对我有用的任何其他活动/surfaceView 实现,但由于某种原因,未调用 onDraw。为了简化问题的代码,我消除了实际的绘图活动,并通过在 onDraw() 中设置断点进行测试。执行未到达 onDraw 调用。添加 postInvalidate() 调用没有帮助。构造函数被调用,并在没有任何问题或异常的情况下执行。到底是怎么回事?19/5/13 - 进一步调查。此活动/SurfaceView 在作为单独项目运行时显示,因此问题不在此处显示的代码中,而在调用活动的代码中。更多即将...

4

2 回答 2

1

您的应用程序的可见状态是否需要尽可能快地不断刷新(如快速变化的游戏)?如果没有,则实际上不需要 SurfaceView,因为您可以在需要时调用 invalidate() 然后实现 onDraw(Canvas) 方法。

如果您确实需要持续快速地渲染,那么使用 SurfaceView 是有意义的。我认为您需要在 SurfaceView 类中添加一个 SurfaceHolder 对象(请参阅http://developer.android.com/reference/android/view/SurfaceHolder.html)。使用 SurfaceHolder.lockCanvas() 访问要绘制到的 Canvas,然后使用正常的 Canvas 绘图函数绘制到它,然后调用 unlockCanvasAndPost(Canvas)。您需要生成一个单独的线程来处理渲染,并且该线程需要一个正在进行的循环,您可以在其中调用 lockCanvas() 和 unlockCanvasAndPost(Canvas)。

于 2013-05-19T09:12:23.163 回答
0

感谢 Rob K 的有用评论。最后,在从头开始仔细地做这个过程之后,问题就消失了。我不确定我做错了什么,但这显然与设置意图或调用 StartActivityForResult() 有关。

于 2013-05-19T12:30:47.497 回答