Мое предложение будет следующим:
1) Используйте функцию анимации, которая запускается в течение фиксированного времени и регулирует размер шага в соответствии с тем, насколько быстро выполняется каждый шаг.Это НИКОГДА не подвергает пользователя длительной анимации, которая занимает больше времени, чем предполагалось.Это может быть изменчивым, но это не будет медленным, чтобы закончить.Общая идея этого типа алгоритма анимации состоит в том, что вы устанавливаете общее время анимации, рассчитываете ожидаемое количество шагов.Вы начинаете выполнять каждый шаг, но на каждом шаге вы проверяете истекшее время, чтобы увидеть, отстаете ли вы от графика.Если вы отстаете от графика (потому что хост-компьютер работает слишком медленно), вы перепрыгиваете на сумму, необходимую для того, чтобы вы вернулись к расписанию.Этот скачок вперед делает анимацию более плавной, чем хотелось бы, но держит вас по графику.Все библиотеки анимации, которые я видел как jQuery и YUI, работают таким образом.
2) В каждой из первых нескольких анимаций (выполненных способом выше) накапливайте stepCnt, который сообщает вам, сколько шагов было выполнено в каждоманимация в фиксированное время.
3) Из некоторого опыта запуска анимации на быстрых и медленных устройствах выясните, какое значение stepCnt означает производительность, достаточно медленную, чтобы ваш пользовательский интерфейс был лучше без анимации вообще.
4) Сделайте свой код адаптивным.Если после первых нескольких анимаций из шага 2) вы увидите, что stepCnt ниже вашего порога (который вы определили в шаге 3), тогда установите глобальный флаг, который вы хотите пропустить, чтобы все будущие анимации просто переходили прямо вконечное состояние.