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事事順利,收穫成功! 動畫