Timer.java Source code

Java tutorial

Introduction

Here is the source code for Timer.java

Source

//package com.studiofortress.sf.util;

/**
 * All times in this Timer object are in milliseconds. The timer starts from the
 * moment of it's creation.
 * 
 * @author Joseph Lenton
 */
public class Timer {
    private final long startTime;
    private final long endTime;
    private final long duration;

    /**
     * @param duration
     *            The amount of time, in milliseconds, that this timer will last
     *            for.
     */
    public Timer(long duration, double percentDone) {
        if (duration <= 0) {
            throw new IllegalArgumentException("The duration cannot be less or equal to 0, given: " + duration);
        } else if (percentDone < 0) {
            throw new IllegalArgumentException(
                    "The percentDone cannot be less or equal to 0, given: " + percentDone);
        }

        this.duration = duration;
        this.startTime = System.currentTimeMillis() - Math.round(duration * percentDone);
        this.endTime = startTime + duration;
    }

    /**
     * @param duration
     *            The amount of time, in milliseconds, that this timer will last
     *            for.
     */
    public Timer(long duration) {
        if (duration <= 0) {
            throw new IllegalArgumentException("The duration cannot be less or equal to 0, given: " + duration);
        }

        this.duration = duration;
        this.startTime = System.currentTimeMillis();
        this.endTime = startTime + duration;
    }

    /**
     * An inverse timer is a timer with the same duration as this timer, but
     * where the percentage that is complete is 1.0 - the current amount of
     * duration done. So if this timer has completed 0.3 of it's duration so
     * far, then the inverse timer will have completed 0.7 so far.
     * 
     * This method is to help with timer based algorithms (like a fade) where
     * you want to reverse the algorithm half way through.
     * 
     * @return A new Timer which has it's percentage complete as the inverse of
     *         this one.
     */
    public Timer getInverse() {
        return new Timer(duration, 1.0 - getPercentDuration());
    }

    /**
     * @return The time that this Timer was created.
     */
    public long getStartTime() {
        return startTime;
    }

    /**
     * @return The time that this Timer was created, plus it's duration.
     */
    public long getEndTime() {
        return endTime;
    }

    /**
     * @return True if this Timer is now past it's end time.
     */
    public boolean isPastDuration() {
        return System.currentTimeMillis() > getEndTime();
    }

    /**
     * @return The amount of time between the start and end time of this Timer.
     */
    public long getDuration() {
        return duration;
    }

    /**
     * The percent duration is based on this moment, now, when it is called.
     * 
     * @return A value from 0 to 1 describing how much of the duration this
     *         timer has gone through.
     */
    public float getPercentDuration() {
        final float percent = (float) (System.currentTimeMillis() - startTime) / (float) duration;
        return Math.min(Math.max(0.0f, percent), 1.0f);
    }
}