마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

lockCanvas 에 대해 질문드립니다.

0 추천

처음 글 올려보네요.

 

package com.example.test;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;

public class GameMain extends SurfaceView implements Callback {
 
 public Context _context;
 
 public GameMain(Context context) {
  
  super(context);
  
  _context = context;
  mSurfaceHolder = getHolder();
  mSurfaceHolder.addCallback(this);
  thread = new GameThread(mSurfaceHolder);
  
 }

 @Override
 public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
  // TODO Auto-generated method stub
  
  Log.i("[뷰]", "BarkusBill - 2.서페이스 교체");
  
 }

 @Override
 public void surfaceCreated(SurfaceHolder holder) {
  // TODO Auto-generated method stub
  
  Log.i("[뷰]", "BarkusBill - 1.서페이스 구성");
  
  if(thread.getState()==Thread.State.TERMINATED) {
   thread = new GameThread(holder);
   thread.start();
  } else {
   thread.start();
  }
  
  mRun = true;
  
 }

 @Override
 public void surfaceDestroyed(SurfaceHolder arg0) {
  // TODO Auto-generated method stub
  
  Log.i("[뷰]", "BarkusBill - 3.서페이스 파괴");
  
  try {
   
   thread.join();
   
  } catch(Exception ex) {
   
   ex.printStackTrace();
   
  }
  
  mRun = false;
  
 }
 
 //-------------------------------------------------------------
 
 private GameThread thread;
 private boolean mRun = false;
 private SurfaceHolder mSurfaceHolder;
 
 class GameThread extends Thread {
  
  public GameThread(SurfaceHolder surfaceHolder) {
   
  }
  
  private void doDraw(Canvas canvas) {
   
   Log.i("", "BarkusBill - 1초에 한번씩 갱신 중."  + mRun + " , " + (ii++));
   
   String String_text = "BarkusBill - 1초에 한번씩 갱신 중."  + mRun + " , " + (ii++);
   float float_x = 10;
   float float_y = 20;
   Paint Paint_paint = new Paint();
   
   Paint_paint.setColor(Color.WHITE);
   Paint_paint.setTextAlign(Paint.Align.LEFT);
   Paint_paint.setTextSize(30);
   
   canvas.drawText(String_text
      , float_x
      , float_y
      , Paint_paint);
   
  }
  
  int ii=0;
  
  public void run() {
   
   Log.i("", "Barkusbill mRun - " + mRun);
   
   while(mRun) {
    
    Canvas canvas = null;
    
    try {
     
     canvas = mSurfaceHolder.lockCanvas(null);
     
     synchronized(mSurfaceHolder) {
      
      sleep(100);
      
      doDraw(canvas);
     }
     
    } catch(Exception ex) {
     
     ex.printStackTrace();
     
    }
    finally {
     
     if(canvas!=null) {
      
      mSurfaceHolder.unlockCanvasAndPost(canvas);
      
     }
     
    }
   }
   
  }
  
 }

}

빨간색.굵은 글씨 로 표시하였습니다.

 

setText 를 canvas 에 쓰레드로 돌리고 있는데

 

lockCanvas 를 사용하면 invalidate() 효과를 줄 수 있다고 하는데

 

setText 로 글자표시하려고 했더니 글씨가 계속 겹칩니다.

 

동작을 안하는 건지? 소스상의 문제인지 알고 싶습니다.

BarkusBill (120 포인트) 님이 2013년 9월 6일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...