2012-04-12 3 views
5

Цель Я хотел бы использовать таймер обратного отсчета, который просто прокручивает числа (а не графики) слева направо.Как реализовать таймер обратного отсчета по горизонтали?

Эффект Эффект будет выглядеть число масштабирования с левой стороны, замедляет к середине, а затем масштабирование прочь направо.

Примечание Поскольку я уже использую TimerTask для выполнения кода каждые второго, я мог бы использовать, чтобы вызвать следующий номер для прокрутки по горизонтали-скроллинг TextView.

Может ли это быть реализовано как текстовое изображение внутри прокрутки? Ищите образец кода, чтобы начать с ....

ответ

9

Использование анимаций было бы самым простым решением. Вы можете создать свой собственный или попробовать и объединить несколько 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); 
    } 
} 
+0

Питер, спасибо, что нашли время, чтобы ответить на мой вопрос! –

+0

@SomeoneSomewhere - это было весело. Надеюсь, поможет! –

Смежные вопросы