Использование анимаций было бы самым простым решением. Вы можете создать свой собственный или попробовать и объединить несколько TranslateAnimations и ScaleAnimations.
Это означало бы помещать каждое число в свой собственный TextView вместо использования прокрутки.
Тогда вы можете управлять ускорением до середины с помощью Interpolator. Интерполяторы - это то, как Android справляется с ослаблением. Вероятно, вам понадобится AccelerateDecelerateInterpolator для ускорения/замедления эффекта.
Вы можете использовать AnimationSet, чтобы применить несколько анимаций к тому же самому виду. Выяснить, как собрать хороший AnimationSet, станет самой сложной частью проекта. Обязательно обратите внимание на свойство «заполнить». На самом деле, немного поиграв, я думаю, что пользовательская анимация проще, чем использование готовых.
Вы можете использовать my GitHub project, который реализует очень простую версию этого. 17 апреля и до того, как я использовал несколько предварительно сделанных анимаций. Если вы посмотрите на самую последнюю версию, вы увидите пользовательскую анимацию.
Сроки для каждой анимации заботятся о себе после того, как вы установите продолжительность для одной анимации. A Handler вызывает следующее число после окончания предыдущего. Я думаю, что это немного аккуратно, чем призывать функцию каждые X секунд, чтобы обновить все.
Схема функциональных возможностей:
- активность (CountDownActivity.java) над все видит.
- В макете Activitiy XML есть кнопка, которая используется для начала отсчета.
- Как только начнется обратный отсчет, кнопка исчезнет. Он появляется, когда происходит обратный отсчет.
- Деятельность содержит Handler (MotionHandler.java). Handler управляет перемещением и синхронизацией номеров.
- Обработчик использует AnimationSet, чтобы переместить номера
- AnimationSet является принятый в зависимости
- Это для гибкости. Просто передайте в другой AnimationSet изменить как номера двигаться
- AnimationSet изготовлен из
четыре анимации
пользовательские анимации (см ниже)
- AnimationSet использует общий AccelerateDecelerateInterpolator, который кажется, работает прилично. Существуют и другие варианты, в том числе написание собственных.
- Обработчик использует delayed message, чтобы начать следующий номер
- Обработчик уведомляет активность, когда отсчет производится с использованием специального слушателя (MotionHandler >> CountdownListener)
- Вращающаяся устройство перезапустит счетчик вниз.
Примечание. Ранее я использовал четыре готовых анимации в одном AnimationSet, я отредактировал, чтобы включить только одну пользовательскую анимацию ... Вы можете настроить свой алгоритм по своему вкусу.
Эта пользовательская анимация использует Cycloid, чтобы номера выглядели большими и меньшими.
/**
* A custom animation to move and scale the numbers.
*
*/
public class NumberAnimation extends Animation
{
final public static float MINIMUM = 3;
private int mHorizontal;
private int mScaling;
public NumberAnimation(int horizontalMovement, int scaling)
{
mHorizontal = horizontalMovement;
mScaling = scaling;
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t)
{
// Cycloid repeats every 2pi - scale interpolatedTime to that
double time = 2 * Math.PI * interpolatedTime;
// Cycloid function
float currentScale = (float) (mScaling * (1 - Math.cos(time))) + MINIMUM;
Matrix matrix = t.getMatrix();
matrix.preScale(currentScale, currentScale);
matrix.postTranslate(mHorizontal * interpolatedTime, 0);
}
}
Питер, спасибо, что нашли время, чтобы ответить на мой вопрос! –
@SomeoneSomewhere - это было весело. Надеюсь, поможет! –