안드로이드 개발 질문/답변
(글 수 45,052)
surfaceview 이거 책에서 나와있는데로 했는데도 오류가 나와서 질문드립니다.
GameView
package com.framwork;
import android.content.Context;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class GameView extends SurfaceView implements SurfaceHolder.Callback{
private GameViewThread m_thread;
public GameView(Context context) {
super(context);
getHolder( ).addCallback(this);
m_thread=new GameViewThread(getHolder( ),this);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceCreated(SurfaceHolder arg0){
//스레드를 실행상태로 만듭니다
m_thread.setRunning(true);
//스레드 실행
m_thread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder arg0){
boolean retry = true;
m_thread.setRunning(false);
while(retry){
try{
//스레드 중지
m_thread.join();
retry= false;
}catch(InterruptedException e){
//스레드가 중지되도록 계속 시도
}
}
}
}
GameViewThread (오류1)
package com.framwork;
import android.graphics.Canvas;
import android.view.SurfaceHolder;
import android.view.View;
public class GameViewThread extends Thread{
//접근을 위한 멤버변수
private SurfaceHolder m_surfaceHolder;
private GameView m_gameview;
private boolean m_run = false;
public GameViewThread(SurfaceHolder surfaceHolder, GameView gameview) {
m_surfaceHolder = surfaceHolder;
m_gameview = gameview;
}
public void setRunning(boolean run){
m_run = run;
}
@Override
public void run( ) {
Canvas _canvas;
while(m_run){
_canvas = null;
try{
//SurfaceHolder를 통해 Suface에 접근해서 가져옴
_canvas = m_surfaceHolder.lockCanvas(null);
synchronized(m_surfaceHolder){
m_gameview.onDraw(_canvas); // 오류 View유형에서 메소드(Canvas)가 가시적이지 않습니다
}
}finally{
if(_canvas != null)
//suface를 화면에 표시
m_surfaceHolder.unlockCanvasAndPost(_canvas);
}
}
}
}
GameViewActivity
package com.framwork;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class GameActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new GameView(this));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_game, menu);
return true;
}
}
오류 내용
View유형에서 메소드(Canvas)가 가시적이지 않습니다
view의 onDraw(Canvas canvas)메소드는 protected 입니다.
즉, 같은 package이거나 상속관계가 아니면 접근이 불가능 합니다.
그런데 GameView 클래스는 SurfaceView를 상속받았지만
onDraw 메소드를 오버라이드 하지 않았습니다.
그래서 GameView.onDraw(Canvas) 메소드는 GameView 자신이 호출하거나
android.view 패키지에 있는 클래스에서만 호출 가능합니다.
해결하기 위해서는 GameView 클래스에서 onDraw 메소드를 오버라이드 하시면 됩니다.