未调用SurfaceView.onDraw

时间:2013-05-16 12:05:40

标签: android android-animation

我已经实现了许多类似的活动,但由于某种原因,以下类没有达到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

}

}

此类实例化并由活动运行:      公共类PlayActivity扩展了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,因此问题不在此处显示的代码中,而是在调用活动的代码中。 更快......

2 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:0)

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