给你的ListView列表添加载入动画

Android开发中,我们经常会用到列表,列表的实现当然是采用ListView或者RecyclerView, 如果能给列表添加炫酷的载入动画,会给用户增加不小的视觉美感,比如stroll.js里面展示的那样,不过他那里面是用CSS实现的动画,在我们的native应用里,我们同样也可以实现这样的效果。开源库JazzyListView已经很好的实现了,不过我们今天来自己实现下这些效果,理解了这些动画的原理,我们就可以随心所欲的在自己的应用中添加各种炫酷的动画效果了。

转载请注明出处:

我们先来实现一个非常小的原型,然后再在这个原型的基础上进行添砖加瓦,这样子更容易理解些,在写这个原型之前,请大家想一想,像stroll.js 那样的动画,都是在什么时候加载的。应该是在view刚出现的时候,那我们可以在Adapter的getview函数里面去初始化动画,因为那里是创建view的地方。

方案一 在getView函数内加载动画 这个方案是可行的,但是不幸的是,在这个函数里面创建view时,我们无法知道ListView是在向上scroll,还是在向下scroll,因为很多动画在在这两种情况下是有区别的。比如Curl动画,向上scroll时是从屏幕内转出,而向下scroll时是从屏幕外开始旋转。所以在Adapter的getview里面加载动画的方案是不可行的。现在只能去监听滚动事件了。

方案二,在OnScrollListener加载动画 在OnScrollListener监听器的OnScroll函数中,有一个firstVisibleItem参数,代表当前可以的第一个item的位置,如果我们将这个参数记录下来,通过比较这个参数,就知道列表是在哪个方向上滚动。

来,,我们先来实现一个OnScrollListener

.mFirstVisibleItem = -1;int mLastVisibleItem = -1;ListView mListView;(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);mListView = (ListView) findViewById(R.id.list);mListView.setAdapter(new MyAdapter(this));//设置滚动监听器mListView.setOnScrollListener(this);}(AbsListView view, int scrollState) {}(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {//listview第一次载入时,两者都为-1boolean shouldAnimate = (mFirstVisibleItem != -1) && (mLastVisibleItem != -1);//滚动时最后一个item的位置int lastVisibleItem = firstVisibleItem + visibleItemCount -1;if(shouldAnimate){//第一次不需要加载动画int indexAfterFist =0;(firstVisibleItem + indexAfterFist < mFirstVisibleItem){View animateView = view.getChildAt(indexAfterFist);//获取item对应的viewdoAnimate(animateView, false);indexAfterFist ++;}int indexBeforeLast = 0;//向下scroll, 情况类似,只是计算view的位置时不一样while(lastVisibleItem – indexBeforeLast > mLastVisibleItem){View animateView = view.getChildAt(lastVisibleItem – indexBeforeLast – firstVisibleItem);doAnimate(animateView, true);indexBeforeLast ++;}}mFirstVisibleItem = firstVisibleItem;mLastVisibleItem = lastVisibleItem;}(View view, boolean scrollDown){//我们这里先写一个最简单地动画,GROWViewPropertyAnimator animator = view.animate().setDuration(500).setInterpolator(new AccelerateDecelerateInterpolator());view.setPivotX(view.getWidth()/2);view.setPivotY(view.getHeight()/2);view.setScaleX(0.01f);view.setScaleY(0.01f);animator.scaleX(1.0f).scaleY(1.0f);animator.start();}}

效果如下:

我们实现了个非常简单的GROW动画,类似stroll.js中那样,这个动画不用考虑滚动方向。

更多动画

接下来,我们要添加更多的动画类型,在此之前,我想还是有必要讲解一下一些动画的基础知识。我们知道Android在3.0的时候引入了属性动画,很多时候你会使用ObjectAnimator来生成动画,但是如果你想在一个view上同时运行多种动画的话,使用ViewPropertyAnimator会更加方便和高效,因为它会优化动画执行过程中调用invalidate的次数。所以在对view进行常用的属性动画时,建议使用ViewPropertyAnimator的。ViewPropertyAnimator中得函数主要分为

所有这些函数后都可以跟By表示相对值,都比较好理解,容易弄混得一点是rotate函数,他有三种情况,

分别对应了View的三个属性设置函数: setRotation, setRotationX, setRotationY,

那接下来,我们就是用ViewPropertyAnimator来依次实现这几种效果:

Grow

Grow是最简单的动画,前面的例子中得效果就是,使用scaleX,scaleY,进行放大

CARD

从stroll.js中可以看到CARD的效果中带有一个围绕水平轴旋转和垂直方向的位移,代码如下

ViewPropertyAnimator animator = view.animate().setDuration(500).setInterpolator(new AccelerateDecelerateInterpolator());view.setPivotX(view.getWidth()/2);view.setPivotY(view.getHeight()/2);view.setRotationX(90);view.setTranslationY(scrollDown? view.getHeight(): -view.getHeight());animator.rotationX(0);animator.translationY(0);animator.start();累死累活不说,走马观花反而少了真实体验,

给你的ListView列表添加载入动画

相关文章:

你感兴趣的文章:

标签云: