2011-09-06 35 views
3

我想製作一個模擬時鐘在黑莓手機上,我希望時鐘之手可以成爲自定義圖像。爲黑莓製作模擬時鐘

我通過這個線程Help with analog clock code,但沒有得到它的工作。任何機構可以幫我做一個模擬時鐘

更新 我得到的代碼是從支持論壇

// How to use it 

ClockBitmapField clock = new ClockBitmapField(face, Field.NON_FOCUSABLE | Field.FIELD_HCENTER, 
              hrPng, minPng, secPng); 

我我可以用這個做一個模擬時鐘

如何使用此

add(clock); 

// Clock Face 

class ClockBitmapField extends BitmapField { 

Bitmap _face = null; 
UpdateClockThread _updateClockThread = null; 
Bitmap [] _hourBitmaps = null; 
Bitmap [] _minBitmaps = null; 
Bitmap [] _secBitmaps = null; 

public ClockBitmapField(Bitmap face, long style, String [] hourPngs, String [] minPngs, String [] secPngs) { 
    super(face, style); 
    _face = face; 
    _ourBitmap = new Bitmap(_face.getWidth(), _face.getHeight()); 
    this.setBitmap(_ourBitmap); // Swap to using work area 
    _hourBitmaps = new Bitmap [hourPngs.length]; 
    for (int i = 0; i < hourPngs.length; i++) { 
     _hourBitmaps[i] = Bitmap.getBitmapResource(hourPngs[i]); 
    } 
    _minBitmaps = new Bitmap [minPngs.length]; 
    for (int i = 0; i < minPngs.length; i++) { 
     _minBitmaps[i] = Bitmap.getBitmapResource(minPngs[i]); 
    } 
    _secBitmaps = new Bitmap [secPngs.length]; 
    for (int i = 0; i < secPngs.length; i++) { 
     _secBitmaps[i] = Bitmap.getBitmapResource(secPngs[i]); 
    } 
} 
protected void onDisplay() { 
    onExposed(); 
} 
protected void onUnDisplay() { 
    onObscured(); 
} 
protected void onExposed() { 
    if (_updateClockThread == null || !_updateClockThread.isAlive()) { 
     _updateClockThread = new UpdateClockThread(_ourBitmap, _face, this, _hourBitmaps, _minBitmaps, _secBitmaps); 
     _updateClockThread.start(); 
    } 
} 
protected void onObscured() { 
    if (_updateClockThread != null) { 
     _updateClockThread.stop(); 
     _updateClockThread = null; 
    } 
} 
public void invalidate() { 
    super.invalidate(); 
} 
class UpdateClockThread extends Thread { 
    private Calendar _cal = null; 
    int _curHr = 0; 
    int _curMin = 0; 
    int _curSec = 0; 
    Bitmap _face = null; 
    int _faceWidth = 0; 
    int _faceHeight = 0; 
    _ourBitmap = null; 
    Graphics _g = null; 
    ClockBitmapField _ourField = null; 
    long LONG_ONE_THOUSAND = 1000; 
    boolean _stopped = false; 
    Bitmap [] _hourBitmaps = null; 
    Bitmap [] _minBitmaps = null; 
    Bitmap [] _secBitmaps = null; 
    public UpdateClockThread(Bitmap ourBitmap, Bitmap face, ClockBitmapField fieldToInvalidate, 
          Bitmap [] hourBitmaps, Bitmap [] minBitmaps, Bitmap [] secBitmaps) { 
     super(); 
     _cal = Calendar.getInstance(); 
     _face = face; 
     _faceWidth = _face.getWidth(); 
     _faceHeight = _face.getHeight(); 
     _ourBitmap = ourBitmap; 
     _g = new Graphics(_ourBitmap); 
     _ourField = fieldToInvalidate; 
    } 
    public void run() { 
     long timeToSleep = 0; 
     while (!_stopped) { 
      _g.setBackgroundColor(0x00191919); 
      _g.clear(); 
      _g.drawBitmap(0, 0, _faceWidth, _faceHeight, _face, 0, 0); 
      _cal.setTime(new Date(System.currentTimeMillis())); 
      _curHr = cal.get(Calendar.HOUR);     
      _curMin = cal.get(Calendar.MINUTE); 
      _curHr = (_curHr * 5) + (5 * _curMin/60); 
      if (_curHr > 60) _curHr = _curHr - 60; 
      _curSec = cal.get(Calendar.SECOND); 
      _g.drawBitmap(0, 0, _faceWidth, _faceHeight, _secBitmaps[_curSec], 0, 0); 
      _g.drawBitmap(0, 0, _faceWidth, _faceHeight, _minBitmaps[_curMin], 0, 0); 
      _g.drawBitmap(0, 0, _faceWidth, _faceHeight, _hourBitmaps[_curHr], 0, 0); 
      _ourField.invalidate(); 
      timeToSleep = LONG_ONE_THOUSAND - (System.currentTimeMillis() % LONG_ONE_THOUSAND); 
      if (timeToSleep > 20) { 
       try { 
        Thread.sleep(timeToSleep); 
       } catch (Exception e) { 
       } 
      } 
     } 
    } 
    public void stop() { 
     _stopped = true; 
    } 
} 

} 

,並分鐘爲第二 感謝,並就通過查看代碼對於 Face ImageHour ImageMinuts Image

+0

該線程包含良好的代碼,你有嘗試過嗎?如果是這樣,那麼你能否指定你的問題是什麼? – medopal

+0

@medopal是的,但我不知道如何傳遞字符串[]中的位圖,所以我不能使用該代碼,你可以告訴我如何去做 – BBdev

+1

用代碼更新你的問題,並指出你沒有代碼行理解,那麼我們可能會提供幫助。 – medopal

回答

3

,看來輸入: String [] hourPngs, String [] minPngs, String [] secPngs分別代表時鐘指針在每個位置上的圖像的文件名列表。

在這個片段中,他建立的60 Bitmaps從字符串數組:

_secBitmaps = new Bitmap [secPngs.length]; 
    for (int i = 0; i < secPngs.length; i++) { 
     _secBitmaps[i] = Bitmap.getBitmapResource(secPngs[i]); 
    } 

然後,在這個片段中,你可以看到他通過傳遞當前的「第二」會從一個陣列的Bitmap對象作爲索引:

_g.drawBitmap(0, 0, _faceWidth, _faceHeight, _secBitmaps[_curSec], 0, 0); 

似乎沒有任何代碼,他旋轉的圖像或任何東西。 所以我想這意味着每個鍾針需要60個圖像。 (共180幅圖像,加上鐘面)。

+0

我做了大小爲60的數組與文件名稱的圖像,但不工作... – BBdev

+1

你可以比「不加工」?不會編譯?拋出異常?屏幕上出現什麼? – icchanobot

+0

我得到了空指針異常..........,當我按下繼續模擬器上,我只能看到我已經作爲位圖傳遞的圖像的臉.. – BBdev