2014-11-02 29 views
0

我寫了一個顯示模擬示波器的自定義視圖,它基本上包含一系列繪圖點,並週期性地將一個脈衝(一組單獨的點)放入主要系列中。唯一的問題是,我想在一個繪圖上以25mm/sec的正確速率更新點,在另一個繪圖上以4mm /秒的速度更新點。Android:Custom Oscilliscope View掃描速率

setRate()在繪製視圖之前調用。 updateData()從一個以60fps循環運行的線程調用SystemClock.elapsedRealtime()。問題是,pxToDraw是不正確的值,以保持我想要的速度。

這裏是我的代碼

static class FakePlot extends OscView.Plot { 

    public void setRate(int width, DisplayMetrics dm) { 
    float xdpi = dm.xdpi; 
    mWidthMm = width/ xdpi * 25.4f; 
    pxPerSec =TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, mScanRateMM, dm); 
    pxPerTick = ((float)width)/mData.length; 
    lastPulse = SystemClock.elapsedRealtime(); 
    Log.e(TAG,String.format("setRate() %s: pxPerSec=%f pxPerTick=%f",mTitle,pxPerSec,pxPerTick)); 
    } 

    /** 
    * Copy the next set of points along 
    * @param realTime 
    */ 
    public void updateData(long realTime) { 
     long diff = realTime - lastUpdate; 
     lastUpdate = realTime; 
     float pxToDraw = ((diff/1000f)/pxPerSec); 
     float ticksToDraw = pxToDraw/(1f/pxPerTick); 
     for (int j = 0; j < ticksToDraw; j++){ 
      // update mData with the next ticksToDrawPoints 
     } 
     setChanged(); 
     notifyObservers(); 
    } 
} 

一個完整的工作示例(不正確的掃描速度是在這裏:http://pastebin.com/nHBxumhV

回答

0

正確的代碼是:

float extraToDraw; 
public void updateData(long realTime) { 
    float mmPerTick = mWidthMm/mData.length; 
    float mmToDraw = (mScanRateMM*diffSec)+extraToDraw; 
    if(mmToDraw < 1) {extraToDraw = mmToDraw;return;} 
    extraToDraw = 0; 
    float drawn = 0; 
    while(drawn < mmToDraw) { 
     drawn+= mmPerTick; 
     // draw the next tick 
    } 
}