Android:Custom Oscilliscope View扫描速率
问题描述:
我写了一个显示模拟示波器的自定义视图,它基本上包含一系列绘图点,并周期性地将一个脉冲(一组单独的点)放入主要系列中。唯一的问题是,我想在一个绘图上以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)
答
正确的代码是:
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
}
}