android - SurfaceView.onDraw 未调用

标签 android android-animation

我已经实现了一些类似的 Activity ,但由于某种原因,下面的类没有到达 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

}

此类由一个 Activity 实例化并运行: 公共(public)类 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);
}
....
}

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

最佳答案

您应用的可见状态是否需要尽可能快地不断刷新(就像快速变化的游戏)?如果不是,则实际上不需要 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)。

关于android - SurfaceView.onDraw 未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16586969/

相关文章:

android - 阻止滚动以及展开/折叠可折叠工具栏

android - 如何使这段动画代码更有效?

android - 如何制作星形并在android中制作动画?

android - 以 MB 计的巨大 iOS/Android 应用程序

java - 在主 Activity 中按后退按钮时如何使应用程序退出?

android - Android MediaPlayer Audio Session ID 指的是什么?

android - Android 中的启动画面 Alpha 动画

android - 美国市场或其他地方是否有任何 Android 设备未附带 Google map 附加组件库?

java - 同时使用多个AnimationDrawables

android - 我可以用动画(而不是动画师)设置 LayoutTransition 吗?