模仿TED演講Android客戶端實現item可伸縮變化的listview - 熱衷技術,熱愛生活

jopen 8年前發布 | 10K 次閱讀 Android開發 移動開發

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

來自: http://my.oschina.net/limiaoneu/blog/596043

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!