模仿TED演講Android客戶端實現item可伸縮變化的listview - 熱衷技術,熱愛生活
2016注定是收獲成功和喜悅的一年,在接下來的一年當中應該更加努力,做一個熱衷技術,熱愛生活的人!
編程不僅僅會是的我的職業,更多的是一種愛好, 開源會使這個行業更加強大, 自由和創新永遠是主旋律.
之前在使用TED演講安卓客戶端的時候, 作為一個未來的安卓開發者的我,看到了它的listview,于是想到了我應該怎么去實現它呢,然后昨天就抽了點時間寫了個小DEMO,放到了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事事順利,收獲成功!