模仿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事事順利,收獲成功!