alexfu
12/28/2014 - 3:47 PM

A counting View that counts from zero to N while animating each increment.

A counting View that counts from zero to N while animating each increment.

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2015 Alex Fu
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
 
public class TextViewCounter extends ViewAnimator {

  private int countTo = 0; // The number to count to
  private int counter = 0; // The current counter

  public TextViewCounter(Context context) {
    super(context);
    init();
  }

  public TextViewCounter(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
  }

  private void init() {
    if (getInAnimation() != null) {
      getInAnimation().setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {
          // No op
        }

        @Override
        public void onAnimationEnd(Animation animation) {
          if (counter <= countTo) {
            showNext();
          }
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
          // No op
        }
      });
    }
  }

  public TextCounter countTo(int countTo) {
    this.countTo = countTo;
    return this;
  }

  public void start() {
    showNext();
  }

  @Override
  public void showNext() {
    int nextIndex = getDisplayedChild() + 1;
    if (nextIndex >= getChildCount()) {
      nextIndex = 0;
    }

    ((TextView) getChildAt(nextIndex)).setText(Integer.toString(counter++));
    super.showNext();
  }
}