2013-05-16 6 views
1

Я реализовал ряд подобных действий, но по какой-то причине следующий класс не достигает вызова onDraw. (очень простой) класс:SurfaceView.onDraw not called

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 расширяет активность {

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 отображается при запуске в виде отдельного проекта, поэтому проблема не в коде, отображаемом здесь, а в коде, который вызывает действие. В ближайшее время ...

ответ

1

Видимое состояние вашего приложения должно постоянно обновляться как можно быстрее (например, быстро меняющаяся игра)? Если это не так, на SurfaceView действительно нет необходимости, так как вы можете просто вызвать invalidate(), когда это необходимо, а затем реализовать метод onDraw (Canvas).

Если вам нужно визуализировать непрерывно и быстро, тогда имеет смысл использовать SurfaceView. Я думаю, вам нужно добавить объект SurfaceHolder в ваш класс SurfaceView (см. http://developer.android.com/reference/android/view/SurfaceHolder.html). Используйте SurfaceHolder.lockCanvas(), чтобы получить доступ к холсту для рисования, затем нарисуйте его, используя обычные функции рисования холста, а затем вызовите unlockCanvasAndPost (Canvas). Вам нужно будет создать отдельный поток для обработки рендеринга, и для потока потребуется непрерывный цикл, где вы будете вызывать lockCanvas() и unlockCanvasAndPost (Canvas).

0

Спасибо Робу за полезный комментарий. В конце концов, после тщательного выполнения процесса с нуля проблема исчезла. Я не уверен, что я делаю неправильно, но это, по-видимому, связано с настройкой намерения или вызовом StartActivityForResult().