2014-11-02 70 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 
    } 
}