OLD | NEW |
(Empty) | |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 package org.chromium.chrome.browser.widget; |
| 6 |
| 7 import android.animation.Animator; |
| 8 import android.animation.ObjectAnimator; |
| 9 import android.content.Context; |
| 10 import android.util.AttributeSet; |
| 11 import android.util.Property; |
| 12 import android.widget.FrameLayout; |
| 13 import android.widget.TextView; |
| 14 |
| 15 import com.google.android.apps.chrome.R; |
| 16 |
| 17 import org.chromium.ui.interpolators.BakedBezierInterpolator; |
| 18 |
| 19 import java.text.NumberFormat; |
| 20 |
| 21 /** |
| 22 * View that shows an integer number. It provides a smooth roll animation on cha
nging the |
| 23 * number. |
| 24 */ |
| 25 public class NumberRollView extends FrameLayout { |
| 26 private TextView mUpNumber; |
| 27 private TextView mDownNumber; |
| 28 private float mNumber; |
| 29 private Animator mLastRollAnimator; |
| 30 |
| 31 /** |
| 32 * A Property wrapper around the <code>number</code> functionality handled b
y the |
| 33 * {@link NumberRollView#setNumberRoll(float)} and {@link NumberRollView#get
NumberRoll()} |
| 34 * methods. |
| 35 */ |
| 36 public static final Property<NumberRollView, Float> NUMBER_PROPERTY = |
| 37 new Property<NumberRollView, Float>(Float.class, "") { |
| 38 @Override |
| 39 public void set(NumberRollView view, Float value) { |
| 40 view.setNumberRoll(value); |
| 41 } |
| 42 |
| 43 @Override |
| 44 public Float get(NumberRollView view) { |
| 45 return view.getNumberRoll(); |
| 46 } |
| 47 }; |
| 48 |
| 49 /** |
| 50 * Constructor for inflating from XML. |
| 51 */ |
| 52 public NumberRollView(Context context, AttributeSet attrs) { |
| 53 super(context, attrs); |
| 54 } |
| 55 |
| 56 @Override |
| 57 protected void onFinishInflate() { |
| 58 super.onFinishInflate(); |
| 59 mUpNumber = (TextView) findViewById(R.id.up); |
| 60 mDownNumber = (TextView) findViewById(R.id.down); |
| 61 |
| 62 assert mUpNumber != null; |
| 63 assert mDownNumber != null; |
| 64 |
| 65 setNumberRoll(mNumber); |
| 66 } |
| 67 |
| 68 /** |
| 69 * Sets a number to display. |
| 70 * @param animate Whether it should smoothly animate to the number. |
| 71 */ |
| 72 public void setNumber(int number, boolean animate) { |
| 73 if (mLastRollAnimator != null) mLastRollAnimator.cancel(); |
| 74 |
| 75 if (animate) { |
| 76 Animator rollAnimator = ObjectAnimator.ofFloat(this, NUMBER_PROPERTY
, number); |
| 77 rollAnimator.setInterpolator(BakedBezierInterpolator.TRANSFORM_CURVE
); |
| 78 rollAnimator.start(); |
| 79 mLastRollAnimator = rollAnimator; |
| 80 } else { |
| 81 setNumberRoll(number); |
| 82 } |
| 83 } |
| 84 |
| 85 /** |
| 86 * Gets the current number roll position. |
| 87 */ |
| 88 private float getNumberRoll() { |
| 89 return mNumber; |
| 90 } |
| 91 |
| 92 /** |
| 93 * Sets the number roll position. |
| 94 */ |
| 95 private void setNumberRoll(float number) { |
| 96 mNumber = number; |
| 97 int downNumber = (int) number; |
| 98 int upNumber = downNumber + 1; |
| 99 |
| 100 NumberFormat numberFormatter = NumberFormat.getIntegerInstance(); |
| 101 String newString = numberFormatter.format(upNumber); |
| 102 if (!newString.equals(mUpNumber.getText().toString())) mUpNumber.setText
(newString); |
| 103 |
| 104 newString = numberFormatter.format(downNumber); |
| 105 if (!newString.equals(mDownNumber.getText().toString())) mDownNumber.set
Text(newString); |
| 106 |
| 107 float offset = number % 1.0f; |
| 108 |
| 109 mUpNumber.setTranslationY(mUpNumber.getHeight() * (offset - 1.0f)); |
| 110 mDownNumber.setTranslationY(mDownNumber.getHeight() * offset); |
| 111 |
| 112 mUpNumber.setAlpha(offset); |
| 113 mDownNumber.setAlpha(1.0f - offset); |
| 114 } |
| 115 } |
OLD | NEW |