ListView动画效果


使用过一款什么值得买的APP,它的ListView的滑动效果的体验是很不错的(上图),查了查资料,其实很简单,可以在Adapter中的getView方法中获取到item的view,然后对做属性动画。

具体思路:

1.滑动采用getView然后做属性动画

2.代码设计上采用装饰模式,提高重用性,再次使用该效果时,直接传入一个adapter即可


负责滑动的adapter

public class SwingAdapter extends DecoratorBaseAdapter{
	
	public SwingAdapter(BaseAdapter adapter) {
		super(adapter);
		// TODO Auto-generated constructor stub
	}
	
	private int mSwingDistance = 300;
	
	private int mSwingItemCount = -1;
	
	private int mDuration = 500;
	
	public void setSwingDistance(int distance){
		mSwingDistance = distance;
	}
	
	public void setSwingDuration(int duration){
		mDuration = duration;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		//获取item的view
		convertView = super.getView(position, convertView, parent);
		if (convertView != null) {
			if(position > mSwingItemCount){
				//做属性动画,达到滑动效果
				swingView(convertView);
				mSwingItemCount = position;
				
			}
		}
		return convertView;
	}
	
	private void swingView(View view){
		ObjectAnimator.ofFloat(view, "alpha", 0);
		AnimatorSet set = new AnimatorSet();
		set.playTogether(ObjectAnimator.ofFloat(view, "translationY", mSwingDistance, 0), ObjectAnimator.ofFloat(view, "alpha", 0, 100));
		set.setDuration(mDuration);
		set.start();
	}
}

下面看装饰类
//装饰类
public class DecoratorBaseAdapter extends BaseAdapter{

	protected final BaseAdapter mDecoratedBaseAdapter;
	
	public DecoratorBaseAdapter(BaseAdapter adapter){
		this.mDecoratedBaseAdapter = adapter;
	}
	
	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return mDecoratedBaseAdapter.getCount();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return mDecoratedBaseAdapter.getItem(position);
	}

	@Override
	public long getItemId(int id) {
		// TODO Auto-generated method stub
		return id;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		
		return mDecoratedBaseAdapter.getView(position, convertView, parent);
	}

}
负责ListView的界面的adapter

public class MainActivity extends Activity {
	private List<Integer> mList = new ArrayList<Integer>();
	private ListView mListView;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initData();
		mListView = (ListView) findViewById(R.id.listview);
		ContentAdapter contentAdapter = new ContentAdapter(new MyAdapter(this, mList));
		SwingAdapter adapter = new SwingAdapter(contentAdapter);
		mListView.setAdapter(adapter);
	}

	private void initData() {
		for (int i = 0; i < 30; i++) {
			mList.add(R.drawable.bg);
		}
	}

	class MyAdapter extends BaseAdapter {
		
		private List<Integer> mContent;
		private Context mContext;

		public MyAdapter(Context context, List<Integer> data) {
			mContext = context;
			mContent = data;
		}

		public void setContent(List<Integer> content) {
			mContent = content;
		}

		public void setContext(Context context) {
			mContext = context;
		}

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return (mContent != null) ? mContent.size() : 0;
		}

		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return (mContent != null) ? mContent.get(position) : 0;
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			if (mContext == null)
				return null;
			ViewHolder viewHolder;
			if (convertView == null) {
				viewHolder = new ViewHolder();
				convertView = View.inflate(mContext, R.layout.list_item, null);
				viewHolder.textView = (TextView) convertView
						.findViewById(R.id.tv);
				convertView.setTag(viewHolder);
			} else {
				viewHolder = (ViewHolder) convertView.getTag();
			}

			viewHolder.textView.setText(position + "");
			return convertView;
		}


		class ViewHolder {
			TextView textView;
		}
	}

}
这样就可以实现效果了


代码下载地址


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值