2012-01-11 3 views
0

View 클래스를 확장하는 클래스에서 onDraw (Canvas canvas) 메서드를 사용하여 사용자 정의보기를 만들었습니다. 나는 2 초마다 내보기를 새로 고치기 위해 invalidate() 메서드를 사용하고 있습니다. 그러나 이제 일부보기 후에보기를 새로 고치고 싶습니다. 120 초 후에 말하는 시간. 어떻게 invalidate() 메서드를 멈 춥니 다. 어떤 제안이나 도움을 주시면 감사하겠습니다.사용자 정의보기 새로 고침을 중지하는 방법은 무엇입니까?

편집

여기 내 코드입니다 : - 당신은 단지 카운터 (예를 들어, INT의 myCounter)를 사용하여 각주기에서 2 값을 증가시킬 필요가

public GameView(Context context){ 
super(context); 

Display display = ((WindowManager)context.getSystemService(
      Context.WINDOW_SERVICE)).getDefaultDisplay(); 
} 

@Override 
    public void draw(Canvas canvas) { 
     // TODO Auto-generated method stub 
     super.draw(canvas); 

     int x = 0; 
     int y = 0; 

     bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); 
     int imageWidth = bmp.getWidth(); 
     int imageHeight = bmp.getHeight(); 

     int width = display.getWidth(); 
     System.out.println("Width = " +width); 
     int height = display.getHeight(); 
     System.out.println("Height = " +height); 
     Random randomX,randomY; 
     randomX = new Random(); 
     randomY = new Random(); 

     x = randomX.nextInt(width - imageWidth); 
     System.out.println("X = " +x); 
     y = randomY.nextInt(height - imageHeight); 
     System.out.println("Y = " +y); 

     Rect dst = new Rect(x , y , x + imageWidth , y + imageHeight); 
     canvas.drawBitmap(bmp, null , dst , null); 
     System.out.println("dst = " +dst); 
     try{ 
     Thread.sleep(1000) 
     } 
     catch(Exception e){ 

     } 
     invalidate(); 

    } 
+0

어디에서 invalidate()를 호출합니까? – Flo

+0

몇 가지 샘플 코드를 게시 할 수 있습니까? – nik431

+0

편집 된 내용을 참조하십시오. – himanshu

답변

0

. 그런 다음 변수 myCounter가 120보다 작은 경우에만이 프로그램 블록을 실행하기 위해 체크 명령어 안에 스레드를 호출하는 코드와 invalidate()를 묶을 수 있습니다.

0

글쎄, 개인적으로 차단하지 않습니다. 내 draw 메서드 내에서 Thread.sleep (1000)을 호출하여 UI 스레드. 대신, Handler 객체를 사용하고 반복 된 invalidate() 호출을 예약하기 위해 재귀 postDelayed 호출을 호출합니다. 마지막으로 "애니메이션"을 시작하고 필요한 경우 다음 코드를 테스트하지 않는 2 개의 특수 함수를 코딩합니다. 코드를 테스트하지 않고 몇 초 만에 쓴 것입니다.주의 할 점. 위에서 언급 한 것처럼 UI 스레드를 차단하는 문제는 해결되지 않지만 Aderito Brinca가 설명한 것은 정확합니다.

private Handler mHandler = new Handler(); 
private boolean isAnimStarted=false; 
final private long refreshIntervalMsec = 2000;  //2 seconds refresh rate 
final private long maxRefreshTimeMsec = 120000; //120 seconds deadline 
private long systemTimeMillisOnStart = -1L; 
private Display display = null; //within a local variable declared in GameView 
//constructor this variable was useless. Now that it is a private 
//class member, it can be used by overridden onDraw or Draw methods. 

public GameView(Context context){ 
    super(context); 
    display = ((WindowManager)context.getSystemService(
      Context.WINDOW_SERVICE)).getDefaultDisplay(); 
    //INSERT THE REST OF YOUR CONSTRUCTOR CODE HERE 
} 

public boolean isGameViewAnimStarted(){ //CALL this in order to check for running anim 
    return isAnimStarted; 
} 

public void startGameViewAnim(){ //CALL this to start your anim thing 
    isAnimStarted=true; 
    systemTimeMillisOnStart = SystemClock.uptimeMillis(); 
    refreshAnim(); 
} 

private void refreshAnim(){ 
    invalidate(); 
    if( (SystemClock.uptimeMillis() - systemTimeMillisOnStart) < maxRefreshTimeMsec){ 
     mHandler.postDelayed(new Runnable(){ 
      public void run(){    
       refreshAnim(); 
      } 
     }, refreshIntervalMsec); 
    } 
    else{ 
     stopGameViewAnim(); 
    } 
} 

public void stopGameViewAnim(){ //CALL this to interrupt your anim thing 
    mHandler.removeCallbacksAndMessages(null); 
    isAnimStarted=false; 
} 



@Override 
public void draw(Canvas canvas) { 
    // TODO Auto-generated method stub 
    super.draw(canvas); 
    //INSERT YOUR CODE HERE 

} 
관련 문제