我已经实现了许多类似的活动,但由于某种原因,以下类没有达到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,因此问题不在此处显示的代码中,而是在调用活动的代码中。 更快......
答案 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()有关。