Android 动画分三种,当中属性动画为我们最经常使用动画,且能满足项目中开发差点儿所有需求,google官方包支持3.0+。我们能够引用三方包nineoldandroids来失陪到低版本号。本样例中就是用属性动画实现效果。

对普通的View做动画,我们仅仅要定义好要的动画ObjectAnimator或AnimatorSet。然后设置属性启动及可。

可是。对ListView做动画应该怎样、什么时候、在什么地方、对哪个View做动画属性呢?

github上有成熟的listview动画包 https://github.com/nhaarman/ListViewAnimations.git , 基本能够满足比較炫的效果,比方google+动态list载入,各种动态list显示及删除。

问题是,假设不能满足我们的需求,怎样实现自己想要的ListView动画效果呢?研究github上项目实现原理发现并不复杂。以下我们就參考开源项目实现自己的ListView动画效果。

要想对ListView的Item做动画,首先想到的是Adapter的getView()方法。在getView方面里能够获得每一个Item view,然后定义好动画效果,结合动画需求对contentView做动画。

如须要做一个删除item时的动画。能够在getView时把View和position传给做的动画或动画集,这个比較简单见代码:

public static AnimatorSet buildListRemoveAnimator(final View view, final List list,
final MyAnimListAdapter adapter, final int index) {
AnimatorListener al = new AnimatorListener() { @Override
public void onAnimationStart(Animator animation) {
// TODO Auto-generated method stub } @Override
public void onAnimationRepeat(Animator animation) {
// TODO Auto-generated method stub } @Override
public void onAnimationEnd(Animator animation) {
// TODO Auto-generated method stub
list.remove(index);
ViewHolder vh = (ViewHolder) view.getTag();
vh.needInflate = true; adapter.notifyDataSetChanged();
} @Override
public void onAnimationCancel(Animator animation) {
// TODO Auto-generated method stub }
}; AnimatorSet animatorSet = new AnimatorSet();
Animator anim = ObjectAnimator.ofFloat(view, "rotationX", 0, 90);
Animator animb = ObjectAnimator.ofFloat(view, "alpha", 1, 0);
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1);
final int height = view.getMeasuredHeight();
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override
public void onAnimationUpdate(ValueAnimator animation) {
// TODO Auto-generated method stub
if (animation.getAnimatedFraction() >= 1) {
view.setVisibility(View.GONE);
}
else {
view.getLayoutParams().height = height
- (int) (height * animation.getAnimatedFraction());
view.requestLayout();
}
}
}); anim.setDuration(ANIMATION_DURATION);
animb.setDuration(ANIMATION_DURATION);
valueAnimator.setDuration(ANIMATION_DURATION + ANIMATION_DURATION + 100);
animatorSet.playTogether(anim, animb, valueAnimator);
animatorSet.addListener(al);
return animatorSet;
}

怎样做一个listview动态现实每一个Item的显示效果。这个教删除复杂,须要计算每一个item动画的開始时间,及推断是否动画现实。还有就是显示动画要依照什么样的规则或是顺序, 计算动画现实的时间等因素。而且不好优化list的性能,及显示效果。

以下的样例仅仅是实现了基本动画效果。性能优化欠缺。

public static AnimatorSet buildShowAnimatorList(ViewGroup parent, ListView list, View view, long mAnimationStartMillis,
int mLastAnimatedPosition, int mFirstAnimatedPosition) {
if (mAnimationStartMillis == -1) {
mAnimationStartMillis = System.currentTimeMillis();
}
ViewHelper.setAlpha(view, 0);
Animator alphaAnimator = ObjectAnimator.ofFloat(view, "alpha", 0, 1);
Animator rx = ObjectAnimator.ofFloat(view, "rotationX", -90, 0);
AnimatorSet set = new AnimatorSet();
set.playTogether(alphaAnimator, rx);
set.setStartDelay(calculateAnimationDelay(list, mLastAnimatedPosition, mFirstAnimatedPosition,mAnimationStartMillis));
set.setDuration(DEFAULTANIMATIONDELAYMILLIS);
set.start();
return set;
} private static long calculateAnimationDelay(ListView list, int last, int first,long starmill) {
long delay; int lastVisiblePosition = list.getLastVisiblePosition();
int firstVisiblePosition = list.getFirstVisiblePosition(); int numberOfItemsOnScreen = lastVisiblePosition - firstVisiblePosition;
int numberOfAnimatedItems = last - first; if (numberOfItemsOnScreen + 1 < numberOfAnimatedItems) {
delay = DEFAULTANIMATIONDELAYMILLIS; } else {
long delaySinceStart = (last - first + 1)
* DEFAULTANIMATIONDELAYMILLIS;
delay = starmill + DEFAULTANIMATIONDELAYMILLIS + delaySinceStart
- System.currentTimeMillis();
}
return Math.max(0, delay);
}

參照上面的方法能够实现自己想要的ListView Item动画,而且能够去自己定义想要的效果。

本例源代码地址:

https://github.com/CankingApp/ListAnimator

多多提建议。多多交流~

Android ListView动画特效实现原理及源代码的更多相关文章

  1. Android ListView动画实现方法

    在Android中listview是最经常使用的控件之中的一个,可是有时候我们会认为千篇一律的listview看起来过于单调,于是就产生了listView动画,listview载入了动画会让用户体验更 ...

  2. android游戏动画特效的一些处理

    游戏中避免不了需要一些动画特效的处理,有些是不方便用美术或者美工来处理的,那么就由我们程序猿来搞了.直接进入正题. 首先是Animation,Animation针对view,可以控制view的位移.缩 ...

  3. [转][Android] ListView中getView的原理+如何在ListView中放置多个item

      ListView 和 Adapter 的基础 工作原理: ListView 针对List中每个item,要求 adapter “给我一个视图” (getView). 一个新的视图被返回并显示 如果 ...

  4. [置顶] android 自定义ListView实现动画特效

    通过自定义ListView实现动画特效,被点击元素A向前移,A之前元素往后移动. 重点在于动画的实现: 具体代码如下: package com.open.widget; import java.uti ...

  5. Android ListView工作原理全然解析,带你从源代码的角度彻底理解

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/44996879 在Android全部经常使用的原生控件其中.使用方法最复杂的应该就是 ...

  6. Android绘图机制(四)——使用HelloCharts开源框架搭建一系列炫酷图表,柱形图,折线图,饼状图和动画特效,抽丝剥茧带你认识图表之美

    Android绘图机制(四)--使用HelloCharts开源框架搭建一系列炫酷图表,柱形图,折线图,饼状图和动画特效,抽丝剥茧带你认识图表之美 这里为什么不继续把自定义View写下去呢,因为最近项目 ...

  7. Android Animation动画实战(一): 从布局动画引入ListView滑动时,每一Item项的显示动画

    前言: 之前,我已经写了两篇博文,给大家介绍了Android的基础动画是如何实现的,如果还不清楚的,可以点击查看:Android Animation动画详解(一): 补间动画 及 Android An ...

  8. Android Animation动画详解(二): 组合动画特效

    前言 上一篇博客Android Animation动画详解(一): 补间动画 我已经为大家介绍了Android补间动画的四种形式,相信读过该博客的兄弟们一起都了解了.如果你还不了解,那点链接过去研读一 ...

  9. paip.关于动画特效原理 html js 框架总结

    paip.关于动画特效原理 html js 框架总结 1. 动画框架的来源:flex,jqueryui 3 2. 特效的分类 3 2.1. Property effects 动态改变一个或多个目标对象 ...

随机推荐

  1. C++数据结构面试题

    原文:http://1527zhaobin.iteye.com/blog/1537110 一.判断链表是否存在环型链表问题:   说明:判断一个链表是否存在环,例如下面这个链表就存在环,n1--> ...

  2. 使用Zxing开发Air版二维码扫描工具

    简介实现的核心要点和几个须要注意的问题: 使用开源类库:Zxing,微信也是用的这个.下载地址:http://code.google.com/p/zxing/ as版:https://github.c ...

  3. GeSHi Documentation

    GeSHi Documentation Version 1.0.8.11 Authors: © 2004 - 2007 Nigel McNie © 2007 - 2012 Benny Baumann ...

  4. 8. 利用反射机制, ListArray,intent来实现多Activity的切换

    package com.example.thenewboston; import android.app.ListActivity; import android.content.Intent; im ...

  5. SQL之查询函数LOCATE、POSITION、INSTR、FIND_IN_SET、IN、LIKE

  6. 算法笔记_210:第六届蓝桥杯软件类决赛真题(Java语言C组)

    目录 1 机器人数目 2 生成回文数 3 空心菱形 4 奇怪的数列 5 密文搜索 6 居民集会 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 机器人数目 标题:机器人数目 少年宫新近邮购了小机器人 ...

  7. java面试第十五天

    网络编程: 多线程+网络: 1.服务器端的等待客户连接代码( while(true) ),服务器端与单个客户端交互的代码放入线程体( run ) 2.客户端如有其他要求,与服务器交互的代码也要放入线程 ...

  8. MySQL auto_increment_increment 和 auto_increment_offset

    参考这一篇文章:(不过我对这一篇文章有异议) http://blog.csdn.net/leshami/article/details/39779509 1:搭建测试环境 create table t ...

  9. dyld: Library not loaded: @rpath/XCTest.framework/XCTest Referenced from: /private/var/mobile/Conta

    dyld: Library not loaded: @rpath/XCTest.framework/XCTest   Referenced from: /private/var/mobile/Cont ...

  10. 网路总结01-HTTP协议和NSURLConnection