模仿TED演講Android客戶端實現item可伸縮變化的listview

    2016註定是收穫成功和喜悅的一年,在接下來的一年當中應該更加努力,作一個熱衷技術,熱愛生活的人! java

編程不單單會是的個人職業,更多的是一種愛好, 開源會使這個行業更增強大, 自由和創新永遠是主旋律. git

    以前在使用TED演講安卓客戶端的時候, 做爲一個將來的安卓開發者的我,看到了它的listview,因而想到了我應該怎麼去實現它呢,而後昨天就抽了點時間寫了個小DEMO,放到了github上, 歡迎你們觀看, 今天主要是記錄一下昨天我想辦法實現這個效果的過程.. github

   因爲每一個item是在狀態有不可見到可見的時候執行動畫的, 那麼我最初的想法就是在重寫listview,在listview中監聽每一個item的狀態, 而後判斷是否執行動畫, 在listview中拿到adapter的實例, 經過adapter的實例, 得到每一個item的View ,而後設置動畫集合, 可是在getAdapter().getView的時候出現問題, convertView的參數遇到問題, 不知道怎麼解決, 而後發現多是思路和方向走偏了, 就又想到了去利用adapter, 在adapter中, getView方法是在每一個item變爲可見狀態的時候執行的, 那麼這個地方正好知足個人條件,因而就在getView的時候爲convertView設置了動畫並執行,代碼以下, 編程

public View getView(int position, View convertView, ViewGroup parent) {
		convertView = LayoutInflater.from(mActivity).inflate(R.layout.list_item, null);
		TextView textView = (TextView) convertView.findViewById(R.id.tv);
		String s = list.get(position).toString();
		textView.setText(s);
		AnimationSet set = new AnimationSet(false);
		ScaleAnimation scale = new ScaleAnimation(0.5f, 1, 0.5f, 1,
				Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
				0.5f);
		scale.setDuration(800);
		scale.setFillAfter(true);
		AlphaAnimation alpha = new AlphaAnimation(0.6f, 1);
		alpha.setDuration(1000);
		alpha.setFillAfter(true);
		set.addAnimation(scale);
		set.addAnimation(alpha);
		convertView.startAnimation(set);
		return convertView;
	}

   而後,今天想到了一點點的優化, 使用了ViewHolder減小了findViewByid的次數, 因爲按上述的寫法的話,每一個item每次加載View的時候都得構造動畫, 浪費了浪費了空間和時間, 後面將set動畫集合保存到靜態類ViewHolder中,大大減小了內存分配的次數,代碼以下,優化從每個細節入手; 優化

public View getView(int position, View convertView, ViewGroup parent) {
		ViewHolder holder = null;
		if(convertView == null){
			holder = new ViewHolder();
			convertView = LayoutInflater.from(mActivity).inflate(R.layout.list_item, null);
			holder.textView = (TextView) convertView.findViewById(R.id.tv);
			AnimationSet set = new AnimationSet(false);
			ScaleAnimation scale = new ScaleAnimation(0.5f, 1, 0.5f, 1,
					Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
					0.5f);
			scale.setDuration(800);
			scale.setFillAfter(true);
			AlphaAnimation alpha = new AlphaAnimation(0.6f, 1);
			alpha.setDuration(1000);
			alpha.setFillAfter(true);
			set.addAnimation(scale);
			set.addAnimation(alpha);
			holder.set = set;
			convertView.setTag(holder);
		}else{
			holder = (ViewHolder) convertView.getTag();
		}
		String s = list.get(position).toString();
		holder.textView.setText(s);
		convertView.startAnimation(holder.set);
		return convertView;
	}

	private static class ViewHolder{
		TextView textView;
		AnimationSet set;
	}

最後,祝你們2016事事順利,收穫成功!  動畫

相關文章
相關標籤/搜索