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; } }