股票场内基金交易,没时间盯盘?
上篇我们分析了一个弹球的复杂动画,今天我们看一个点简单点属性动画 – AnimationCloning,它的位于animation/AnimationCloning 。从名字上我们可以看到要看的是动画的克隆,也就是复制,是怎么实现的实现的呢?
在 AnimationCloning 实现非常简单,只有一个 button,点击就会触发动画,然后就是四个小球了,点击之后就发一系列动画,今天我们主要来看 MyAnimationView 实现,首先可以看到它继承了 ValueAnimator.AnimatorUpdateListener 接口,这个是用于监听动画更新的接口,我们这里只做了一件事,就是 invalidate()。很简单就是在动画更新的时候刷新 UI,这步很关键,如果不刷新 UI 我们根本看不到动画的改变,接下来看看 MyAnimationView 构造方法的操作
1 2 3 4 5 6 7 8 9 10 |
public MyAnimationView(Context context) { super(context); mDensity = getContext().getResources().getDisplayMetrics().density; ShapeHolder ball0 = addBall(50f, 25f); ShapeHolder ball1 = addBall(150f, 25f); ShapeHolder ball2 = addBall(250f, 25f); ShapeHolder ball3 = addBall(350f, 25f); |
看到这有没有很眼熟?没错就是 addBall() 方法,这个在上次我们已经讲过了就不在赘述。在构造方法里,创建除了四个弹球,并确定位置,但是 addBll() 方法并没有绘制出来,而是在 onDraw() 方法中进行绘制,和 BouncingBalls 的机制是一致的,那么最核心的方法就是 createAnimation() 了,我们一起来看一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
private void createAnimation() { if (animation == null) { ObjectAnimator anim1 = ObjectAnimator.ofFloat(balls.get(0), "y", 0f, getHeight() - balls.get(0).getHeight()).setDuration(500); ObjectAnimator anim2 = anim1.clone(); anim2.setTarget(balls.get(1)); anim1.addUpdateListener(this); ShapeHolder ball2 = balls.get(2); ObjectAnimator animDown = ObjectAnimator.ofFloat(ball2, "y", 0f, getHeight() - ball2.getHeight()).setDuration(500); animDown.setInterpolator(new AccelerateInterpolator()); ObjectAnimator animUp = ObjectAnimator.ofFloat(ball2, "y", getHeight() - ball2.getHeight(), 0f).setDuration(500); animUp.setInterpolator(new DecelerateInterpolator()); AnimatorSet s1 = new AnimatorSet(); s1.playSequentially(animDown, animUp); animDown.addUpdateListener(this); animUp.addUpdateListener(this); AnimatorSet s2 = (AnimatorSet) s1.clone(); s2.setTarget(balls.get(3)); animation = new AnimatorSet(); animation.playTogether(anim1, anim2, s1); animation.playSequentially(s1, s2); } } |
这里就是创建动画的代码了,最开始创建的就是一个改变第一个弹球 y 坐标的属性动画,且动画时间为 500 毫秒,没什么好说的。接下来看 anim2,它是 anim1.clone() 克隆出来的,但是这时候就会有一个问题了,clon() 是完全的复制,如果时间使用的话动画会作用在第一个弹球上,所以我们通过 setTarget() 的方式,改变了它的作用对象,这样就没有问题了,关于 setTarget() 的问题我们在之前的文章中已经讲过了哦。
接下就是第三个弹球的动画了,先是创建科一个坠落的动画,并设置了加速度的 Interpolator,然后创建了一个升起的动画,并设置了 DecelerateInterpolator,最后被塞进了 AnimatorSet 里,并且播放的时候通过 playSequentially(animDown, animUp) 依次播放动画,造成先下降后上升的视觉效果。第四个弹球也是克隆的得第三个效果,没什么东西了。最后就是把这写动画都添加到 AnimatorSet ,并且通过playTogether(anim1, anim2, s1) 设置前三个弹球一起播放动画,然后 通过 playSequentially(s1, s2) 设置播放第三个动画后播放第四个弹球的动画,加起来就是 AnimationCloning 完整的动画了。
想获得去掉 5 元限制的证券账户吗?

如果您想去掉最低交易佣金 5 元限制,使用微信扫描左边小程序二维码,访问微信小程序「优财助手」,点击底部菜单「福利」,阅读文章「通过优财开证券账户无最低交易佣金 5 元限制」,按照文章步骤操作即可获得免 5 元证券账户,股票基金交易手续费率万 2.5。
请注意,一定要按照文章描述严格操作,如错误开户是无法获得免 5 元证券账户的。