0

我试图找出设置任意时间的逻辑,然后以不同的速度(如 0.5 倍或 4 倍实时)“回放”该时间。

这是我到目前为止的逻辑,它将以正常速度播放时间:

import java.util.Calendar;


public class Clock {


    long delta;
    private float speed = 1f;

    public Clock(Calendar startingTime) {
        delta = System.currentTimeMillis()-startingTime.getTimeInMillis();
    }

    private Calendar adjustedTime() {
        Calendar cal = Calendar.getInstance();

        cal.setTimeInMillis(System.currentTimeMillis()-delta);

        return cal;

    }

    public void setPlaybackSpeed(float speed){
        this.speed  = speed;
    }

    public static void main(String[] args){


        Calendar calendar = Calendar.getInstance();
        calendar.set(2010, 4, 4, 4, 4, 4);
        Clock clock = new Clock(calendar);

        while(true){
            System.out.println(clock.adjustedTime().getTime());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }


}

我无法确定逻辑中需要在何处使用“速度”属性。

4

1 回答 1

2

下面的代码给出了一个如何设计这样一个时钟的例子,它的内部状态是 adouble sppedlong startTime。它公开了一个 publish 方法getTime(),它将返回自 1970 年 1 月 1 日午夜以来调整后的时间(以毫秒为单位)。请注意,调整发生在startTime.

计算调整时间的公式很简单。首先通过减去 来获取实时时间增量currentTimeMillis()startTime然后将此值乘以speed得到调整后的时间增量,然后将其相加startTime得到结果。

public class VariableSpeedClock {

    private double speed;
    private long startTime;

    public VariableSpeedClock(double speed) {
        this(speed, System.currentTimeMillis());
    }

    public VariableSpeedClock(double speed, long startTime) {
        this.speed = speed;
        this.startTime = startTime;
    }

    public long getTime () {
        return (long) ((System.currentTimeMillis() - this.startTime) * this.speed + this.startTime);
    }

    public static void main(String [] args) throws InterruptedException {

        long st = System.currentTimeMillis();
        VariableSpeedClock vsc = new VariableSpeedClock(2.3);

        Thread.sleep(1000);

        System.out.println(vsc.getTime() - st);
        System.out.println(System.currentTimeMillis() - st);

    }
}
于 2013-05-14T03:12:41.183 回答