import * as view from 'tns-core-modules/ui/core/view'; import {View} from 'tns-core-modules/ui/core/view'; import * as pages from 'tns-core-modules/ui/page'; import {Button} from 'tns-core-modules/ui/button'; import {SegmentedBar, SegmentedBarItem} from 'tns-core-modules/ui/segmented-bar'; import {Label} from 'tns-core-modules/ui/label'; import {Animation, AnimationDefinition} from 'tns-core-modules/ui/animation'; import * as fpsMeter from 'tns-core-modules/fps-meter'; let fpsCallbackId; export function onLoaded(args) { const page = args.object; const fpsLabel = view.getViewById(page, 'fps') as Label; fpsCallbackId = fpsMeter.addCallback((fps: number, minFps: number) => { fpsLabel.text = `${fps.toFixed(2)}/${minFps.toFixed(2)}`; }); fpsMeter.start(); } export function onUnloaded() { fpsMeter.removeCallback(fpsCallbackId); fpsMeter.stop(); } export function getBoxPropertyAnimationData(property: string, animateEase: string, target: View, extentX: number = 128, extentY: number = 128) { let animateKey; let animateValueTo; let animateValueFrom; let animateDuration = animateEase === 'spring' ? 800 : 500; let animateReturnDelay = animateEase === 'spring' ? 0 : 200; // Determine the full animation property name (some are shortened in UI), and the demo to/from values switch (property) { case 'height': target.originX = target.originY = 0.5; animateKey = 'height'; animateValueTo = 0; animateValueFrom = extentY; break; case 'width': target.originX = target.originY = 0.5; animateKey = 'width'; animateValueTo = 0; animateValueFrom = extentX; break; case 'opacity': animateKey = 'opacity'; animateValueTo = 0; animateValueFrom = 1; break; case 'color': animateKey = 'backgroundColor'; animateValueTo = 'blue'; animateValueFrom = 'purple'; break; case 'rotate': target.originX = target.originY = 0.5; animateKey = 'rotate'; animateValueTo = 180; animateValueFrom = 0; break; case 'scale': target.originX = target.originY = 0.5; animateKey = 'scale'; animateValueTo = {x: 0.1, y: 0.1}; animateValueFrom = {x: 1, y: 1}; break; default: throw new Error(`demo animation for '${property}' is not implemented`); } return { animateEase, animateKey, animateValueTo, animateValueFrom, animateReturnDelay, animateDuration }; } export function easeAnimate(args) { const clicked = args.object as Button; const page: pages.Page = clicked.page; const select = view.getViewById(page, 'select') as SegmentedBar; const item: SegmentedBarItem = select.items[select.selectedIndex]; const animsIn: AnimationDefinition[] = []; const animsOut: AnimationDefinition[] = []; for (let i = 0; i < 100; i++) { const box = view.getViewById(page, 'el-' + i) as Label; const prop = getBoxPropertyAnimationData(item.title, clicked.text, box, 32, 24); animsIn.push({ [prop.animateKey]: prop.animateValueTo, delay: 15 * i, target: box, duration: prop.animateDuration, curve: prop.animateEase }); animsOut.push({ [prop.animateKey]: prop.animateValueFrom, target: box, delay: prop.animateReturnDelay + (5 * (Math.abs(i - 100))), duration: prop.animateDuration, curve: prop.animateEase }); } new Animation(animsIn, false).play() .then(() => new Animation(animsOut, false).play()) .catch((e) => console.log(e)); }