不用listview的listSelector属性展示切换item,自定义带滑动动画的切换item:
首先XML中定义一个listview,把listSelector设成透明:
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:listSelector="#00000000" />
自定义的选中图案,高度要和item高度相当:
<ImageView
android:id="@+id/list_selected_img"
android:layout_width="match_parent"
android:layout_height="70dp"
android:background="@drawable/selected_bg" />
自定义item的布局 list_item:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="70dp" >
<TextView
android:id="@+id/item_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="35dp"
android:textSize="30sp"
android:layout_centerInParent="true"
android:textColor="#88ffffff" />
</RelativeLayout>
自定义一个listview的adapter:
public class ListViewAdapter extends BaseAdapter{
private Context context;
private ArrayList<ListInfo> list;
private int fcousItem = 0;
public void setFocus(int foucsIndex){
this.fcousItem = foucsIndex;
}
public ListViewAdapter(Context context,ArrayList<String> list){
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int arg0) {
return null;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = LayoutInflater.from(context).inflate(R.layout.list_item,null);
TextView textView = (TextView) convertView.findViewById(R.id.item_text);
textView.setText(list.get(position));
if(fcousItem==position){//做选中时候字体放大和变色
textView.setTextSize(36);
textView.setTextColor(Color.WHITE);
}
return convertView;
}
}
关键的部分来了,本人思路是用位移补间动画TranslateAnimation,每次切换item都播放动画;但动画没播放完,又切启动了新的动画怎么办呢?这里我做了个存储动画的list,让每一个动画都能完整播放。
主要代码(别直接拷代码,看清楚了):
private ListView mListView;
private ListViewAdapter mListViewAdapter;
private ListInfo mListInfo;
private ArrayList<String> mList;
private ImageView mImageView;
private static boolean AnimationEnd = true;
private static int lastSelected = 0;
private final int START_ANIMATION = 0;
private ArrayList<AnimationInfo> AnimationList = new ArrayList<AnimationInfo>();//动画列表
-------------------------------------
mImageView = (ImageView) findViewById(R.id.list_selected_img);
mListView = (ListView) findViewById(R.id.list);
mList = new ArrayList<String>();//自己加数据...
mListViewAdapter = new ListViewAdapter(this, mList);
mListView.setAdapter(mListViewAdapter);
mListView.setFocusable(true);
mListView.requestFocus();
mListView.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View view,
int position, long arg3) {
AnimationInfo mAnimationInfo = new AnimationInfo();
mAnimationInfo.TargetView = view;
mAnimationInfo.TargetTranslateY = (position - lastSelected) * 70;//70为item高度
lastSelected = position;
AnimationList.add(mAnimationInfo);//把动画加入动画列表
if(AnimationEnd){
setTranslate(mImageView, AnimationList.get(0).getTargetView().getY(),
AnimationList.get(0).getTargetTranslateY());
}
mListViewAdapter.setFocus(position);//设置选中项
mListViewAdapter.notifyDataSetChanged();//更新列表
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
Log.d("hzb", "mListView onNothingSelected");
}
});
mListView.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View arg0, boolean arg1) {
if(arg1){
mImageView.setVisibility(View.VISIBLE);
}else{
mImageView.setVisibility(View.INVISIBLE);//焦点不在listview上隐藏item选中背景
}
}
});
-------------------------------
/*
*设置动画
*/
public void setTranslate(final View v, final float toY, float transY){
TranslateAnimation mTranslateAnimation = new TranslateAnimation(0, 0, 0, transY);//垂直列表,只需要知道垂直位移
mTranslateAnimation.setDuration(180);
mTranslateAnimation.setFillAfter(true);
mTranslateAnimation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation arg0) {
AnimationEnd = false;
}
@Override
public void onAnimationRepeat(Animation arg0) {
}
@Override
public void onAnimationEnd(Animation arg0) {
v.clearAnimation();
v.setY(toY);
AnimationList.remove(0);
if(AnimationList.size()==0){
AnimationEnd = true;//动画完成
}else{
mHandler.sendEmptyMessage(START_ANIMATION);//通知执行下一个动画
}
}
});
v.startAnimation(mTranslateAnimation);
}
Handler mHandler = new Handler(new Callback() {
@Override
public boolean handleMessage(Message arg0) {
switch (arg0.what) {
case START_ANIMATION:
setTranslate(mImageView, AnimationList.get(0).getTargetView().getY(),
AnimationList.get(0).getTargetTranslateY());
break;
default:
break;
}
return false;
}
});