这篇文章给大家分享的是有关Android实现支付宝蚂蚁森林水滴浮动效果的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
可以有多个水滴,可以控制位置,水滴上下浮动。点击水滴产生搜集动画,水滴向树移动并逐渐消失,如图:
那么是如何实现的呢,下面我们一步步来分析:
1,定义一个继承Relativelayout的子类作为容器放置多个水滴并在Onlayout()中设置子控件的位置
@Override protected 才能;void  onLayout (boolean 改变,,int l, int t, int r, int b), { ,,,final int count =, getChildCount (); , ,,,for (int 小姐:=,0;,小姐:& lt;,计数;,我+ +),{ ,,,,,View child =, getChildAt(我); ,,,,,int childWidth =, child.getMeasuredWidth (); ,,,,,int childHeight =, child.getMeasuredHeight (); ,,,,,if (child.getVisibility(), !=,消失),{ ,,,,,,,child.layout (listX.get(我),listY.get(我),childWidth +, listX.get(我),childHeight +, listY.get(我)); ,,,,,} ,,,} 以前,,}>上面代码最重要的就是child.layout()函数,前两个参数为子控件的位置,这我先去盗个图:
如图,前两个参数分别为getLeft和getTop,后两个参数分别为getRight和getBottom;前两个参数其实是我们重外界传进来的子坐标列表,代码如下:
List, listX =, new ArrayList<在(); List<才能;Integer>, listY =, new ArrayList<在(); , public 才能;void  setChildPosition (int posx, int 诗句),{ ,,,listX.add (posx); ,,,listY.add(诗句); 以前,,}> 对于后面两个参数我们需要先获取子控件的宽高,然后在叠加上前面两个参数就是我们需要的坐标,在上面代码中可以看到我们是通过child.getmeasure来获取的宽高,但在获取宽高之前我们还需要去测量子空间的宽高。这个测量需要在()中测量完成:
@Override protected 才能;void  onMeasure (int widthMeasureSpec, int heightMeasureSpec), { ,,,super.onMeasure (heightMeasureSpec widthMeasureSpec也); ,,,measureChildren (heightMeasureSpec widthMeasureSpec也); 以前,,}>至此,我们的父容器已经设计完成,接下来我们需要自己定义子控件以及子控件的动画,首先是一个浮动的动画,因为我们这里后面需要监听点击动作,所以最好使用属性动画完成,如下:
private void doRepeatAnim (), { ,,,ObjectAnimator animator =, ObjectAnimator.ofFloat (,,“translationY",,填充,,填充、,填充); ,,,animator.setRepeatMode (ObjectAnimator.REVERSE); ,,,animator.setRepeatCount (ObjectAnimator.INFINITE); ,,,animator.setDuration (1500); ,,,animator.start (); 以前,,}>就是让其沿Y轴上下移动,设置为INFINTE则为无限重复动画;第二个动画就是我们点击的时候,子控件会移动到某个特定的位置并逐渐消失:
, this.setOnClickListener (OnClickListener new (), { ,,,,@Override ,,,,,public void onClick (View 视图),{ ,,,,,,,doSetAnim (); ,,,,,} ,,,});private void doSetAnim (), { ,,,if (isCollect),返回; ,,,isCollect =,真的; ,,,ObjectAnimator move1 =, ObjectAnimator.ofFloat (,,“translationX",, startWidth,, endWidth); ,,,ObjectAnimator move2 =, ObjectAnimator.ofFloat (,,“translationY",, startHeight,, endHeight); ,,,ObjectAnimator move3 =, ObjectAnimator.ofFloat (,,“alpha",, 1,, 0); , ,,,AnimatorSet AnimatorSet =, new AnimatorSet (); ,,,animatorSet.playTogether (move1, move2,, move3); ,,,animatorSet.setDuration (1500); ,,,animatorSet.start (); 以前,,}>里面我添加了isCollect判断,用于处理点击事件重复生效的问题,这里是一个动画组合,重当前位置移动到特定位置同时透明度也不断的变淡。写动画的时候特别应该注意一个问题就是当前的所有位置都不是外面传进来的位置而是以当前控件初始位置为参考的相对位置,因为我们在父控件的时候就设定好了子控件的位置,不能再次进行重复设定不然会叠加,所以上面的startwidth和startHeight其实都是0,endWidth和endHeight也是结束位置减去控件移动的初始位置:
Android实现支付宝蚂蚁森林水滴浮动效果的方法