使用过一款什么值得买的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;
}
}
}
这样就可以实现效果了