package com.tencent.livebackground.util; public abstract class Dynamics { protected long mLastTime; protected float mMaxPosition; protected float mMinPosition; protected float mPosition; protected float mVelocity; public Dynamics() { mMaxPosition = Float.MAX_VALUE; mMinPosition = Float.MIN_VALUE; mLastTime = 0L; } public void adjustPositionAndVelocity() { mVelocity = 0.0F; if(mPosition < mMinPosition) mPosition = mMinPosition; else if(mPosition > mMaxPosition) { mPosition = mMaxPosition; return; } } protected float getDistanceToLimit() { float distance = 0.0F; if(mPosition > mMaxPosition) { distance = mMaxPosition - mPosition; } else { if(mPosition < mMinPosition) return mMinPosition - mPosition; } return distance; } public float getPosition() { return mPosition; } public float getVelocity() { return mVelocity; } public boolean isAtRest(float velocityTolerance, float positionTolerance) { boolean velocityFlag; boolean positionFlag; if(Math.abs(mVelocity) < velocityTolerance) velocityFlag = true; else velocityFlag = false; if(mPosition - positionTolerance < mMaxPosition && positionTolerance + mPosition > mMinPosition) positionFlag = true; else positionFlag = false; return velocityFlag && positionFlag; } protected abstract void onUpdate(int dt); public void setMaxPosition(float maxPosition) { mMaxPosition = maxPosition; } public void setMinPosition(float minPosition) { mMinPosition = minPosition; } public void setState(float position, float velocity, long timeMillis) { mVelocity = velocity; mPosition = position; mLastTime = timeMillis; } public void update(long timeMillis) { int timeDiff = (int)(timeMillis - mLastTime); if(timeDiff > 500) timeDiff = 500; for(; timeDiff > 0; timeDiff -= 10) onUpdate(Math.min(timeDiff, 10)); mLastTime = timeMillis; } }