2011-02-08 40 views
1

我有我的類實現Drawable。我需要重新繪製它以獲得一些「閃爍」效果。我正在使用timer.schedule來安排invalidateSelf(),但沒有任何事情發生。重新繪製通過timer使用invalidateSelf()不可用

private class DrawableImpl extends Drawable { 
    private boolean blinkFlag = false; 
    private Timer timer = new Timer(false); 

    private int maxFlashCount = 21; 
    private int intervalBetweenFlashesInMs = 100; 
    private int currentFlashNumber = 0; 

    @Override 
    public void draw(Canvas canvas) { 
     Log.i(TAG, "draw"); 

     /*draw stable part*/ 

     if (blinkFlag) { 
      Log.i(TAG, "blink"); 
      /*draw bliking part*/ 
     } 

     blinkFlag = !blinkFlag; 

     final DrawableImpl drawableImpl = this; 
     if (currentFlashNumber < maxFlashCount) { 
      Log.i(TAG, "schedule"); 
      timer.schedule(new TimerTask() { 
       @Override 
       public void run() { 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          Log.i(TAG, "run from back"); 
          drawableImpl.invalidateSelf(); 
         } 
        }); 
       } 
      }, intervalBetweenFlashesInMs); 
      currentFlashNumber++; 
     } 
    } 
} 

在日誌是這樣的
02-08 23:07:44.791:信息/(258):畫
02-08 23:07:44.791:信息/(258):眨眼
02-08 23:07:44.791:INFO /(258):schedule
02-08 23:07:45.011:INFO /(258):從後面運行
02-08 23:07:45.021:INFO /( 258):draw
02-08 23:07:45.021:INFO /(258):schedule
02-08 23:07:45.171:INFO /(258):從後面運行
02-08 23:07:45.171:INFO /(258):draw
02-08 23:07:45.171:INFO /(258):blink
02-08 23:07:45.171:INFO /(258 ):日程表
02-08 23:07:45.331:信息/(258):從後面運行

爲什麼它沒有工作?我應該使用其他方法嗎?

+0

該代碼是正確的,但我在閃存邏輯實現中犯了一個錯誤。但是使用Drawable.Callback是個好主意 – hatesms

回答

2

我相信developer doc有答案。

使用當前Drawable.Callback 實現有這個可繪製 重繪。 如果沒有,則不執行任何操作 附加到Drawable的回調函數。