目标 我想实现一个倒数计时器,它只是从左到右滚动数字(不是图形).
效果 效果看起来像数字从左侧放大,向下放慢到中间,然后向右缩放.
注意 由于我已经使用TimerTask每秒执行一次代码,我可以使用它来触发下一个数字来滚动水平滚动的textview.
这可以在scrollview中作为textview实现吗?寻找代码示例开始....
使用动画将是最简单的解决方案.您可以创建自己的或尝试并组合多个TranslateAnimations和 ScaleAnimations.
这意味着将每个数字放入其自己的TextView中,而不是使用滚动视图.
然后你可以用插值器控制加速度到中间.插值器是Android处理缓和的方式.您可能希望AccelerateDecelerateInterpolator用于加速/减速效果.
您可以使用AnimationSet将多个动画应用于同一视图.弄清楚如何组合一个好的AnimationSet将是该项目中最具挑战性的部分.一定要注意"填充"属性.事实上,在玩了一下之后,我认为自定义动画比使用现成动画更简单.
您可以派生我的GitHub项目实现一个非常简单的版本.4月17日之前,我使用了多个预先制作的动画.如果查看最新版本,您将看到自定义动画.
在为一个动画设置持续时间后,每个动画的时间都会自行处理.一个处理程序调用的下一个号码前一个结束之后.我认为这比每隔X秒调用一个函数来更新所有内容要小一些.
功能概要:
注意 - 以前我在一个AnimationSet中使用了四个现成的Animations,我编辑过只包含一个自定义动画......你可以根据自己的喜好调整它的算法.
此自定义动画使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1056 次 |
| 最近记录: |