package com.drawbridge.dm.animation;
import com.drawbridge.utils.Utils;
public class NativeAnimationTween
{
public final long mTimeLength;
public final NativeAnimationItem[] mFrames;
private boolean isAllowedToTween = true;
public NativeAnimationTween(NativeAnimationItem[] frames, double timeDelay) {
mFrames = frames;
mTimeLength = (long) (timeDelay * 1000);
}
public void stopTween()
{
isAllowedToTween = false;
}
public Thread getTween()
{
Thread result = new Thread(new Runnable() {
@Override
public void run()
{
Utils.out.println(this.getClass(),"NAT started with " + mFrames.length + " frames");
long timeDelayInMilli = 10;
long timeLength = mTimeLength;
int expectedRuns = Utils.safeLongToInt((mTimeLength / timeDelayInMilli));
// Utils.out.println(this.getClass(),"Expected Runs:" + expectedRuns);
double[] xDiffs = new double[mFrames.length];
double[] yDiffs = new double[mFrames.length];
double[] wDiffs = new double[mFrames.length];
double[] hDiffs = new double[mFrames.length];
double[] currentX = new double[mFrames.length];
double[] currentY = new double[mFrames.length];
double[] currentW = new double[mFrames.length];
double[] currentH = new double[mFrames.length];
for (int i = 0; i < mFrames.length; i++)
{
if (mFrames[i].x != null)
xDiffs[i] = mFrames[i].x - mFrames[i].mObject.getX();
else
xDiffs[i] = 0;
if (mFrames[i].y != null)
yDiffs[i] = mFrames[i].y - mFrames[i].mObject.getY();
else
yDiffs[i] = 0;
if (mFrames[i].w != null)
wDiffs[i] = mFrames[i].w - mFrames[i].mObject.getWidth();
else
wDiffs[i] = 0;
if (mFrames[i].h != null)
hDiffs[i] = mFrames[i].h - mFrames[i].mObject.getHeight();
else
hDiffs[i] = 0;
currentY[i] = mFrames[i].mObject.getLocation().y;
currentX[i] = mFrames[i].mObject.getLocation().x;
currentW[i] = mFrames[i].mObject.getSize().width;
currentH[i] = mFrames[i].mObject.getSize().height;
}
while (timeLength >= 0 && isAllowedToTween)
{
for (int i = 0; i < mFrames.length; i++)
{
// Change Location
double xAdd = (xDiffs[i] != 0.0 && expectedRuns != 0) ? xDiffs[i] / expectedRuns : 0;
double yAdd = (yDiffs[i] != 0.0 && expectedRuns != 0) ? yDiffs[i] / expectedRuns : 0;
currentX[i] += xAdd;
currentY[i] += yAdd;
if(xAdd != 0.0 || yAdd != 0.0)
mFrames[i].mObject.setLocation((int) currentX[i], (int) currentY[i]);
// Change Size
double wAdd = (wDiffs[i] != 0.0 && expectedRuns != 0) ? wDiffs[i] / expectedRuns : 0;
double hAdd = (hDiffs[i] != 0.0 && expectedRuns != 0) ? hDiffs[i] / expectedRuns : 0;
currentW[i] += wAdd;
currentH[i] += hAdd;
if(wAdd != 0.0 || hAdd != 0.0)
mFrames[i].mObject.setSize((int) currentW[i], (int) currentH[i]);
}
// Wait for the time delay
timeLength -= timeDelayInMilli;
try
{
Thread.sleep(timeDelayInMilli);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
});
return result;
}
}