listview select 动画效果

不用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;
	}
});







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值