當前位置:編程學習大全網 - 源碼下載 - 怎樣在Expandablelistview上加展開動畫效果

怎樣在Expandablelistview上加展開動畫效果

解決方案Github pull request鏈接:

Android的原生提供和展開分組的ListView:ExpandableListView,然而相比於iOS上原生提供的UITableView,其UI能力不足,比如沒有原生的動畫展開和收起效果支持。

在開源代碼社區我們可以找到幾個為Android的ExpandableListView添加的動畫解決方案。其中idunnololz的AnimatedExpandableListView是不錯的方案之壹。 。它的優點:性能較好,提供源代碼而不是library(這點很重要),註釋清晰。

然而性能的優化是沒有止境的,當分組內的子view(childView)變得復雜,或者ListView的parent結構復雜,例如內嵌與其它LinearLayout, FrameLayout或者ScrollView之中,並且parent的使用自定義的重寫的onMeasure()方法時,生成childView的效率就會大大影響應用的性能。

合理使用AnimatedExpandableListView的關鍵是在於AnimatedExpandableListView#getRealChildView()的實現,這是應用開發的責任。實際項目中,通過優化getRealChildView(),動畫效果的啟動時間從1340ms減少到了680ms (展開壹個含有5個子項目的分組)。而發現的問題的定位和解決方案,基本是用過使用Android提供的method tracing方法(android.os.Debug.startMethodTraceing)進行分析。

優化前的getRealChildView()實現,需要大量的view初始化,因為沒有可用的convertView,而事實上,在動畫繪制階段時生成的childView完全可以被重用,及時convertView並為給出。如下面的traceview profile看到的,優化前,getChildView()消耗了超過壹秒的時間。

優化後的性能:

這是如何做到的呢?這需要我們再研究壹下動畫展開的原理,也就是getChildView()裏面耗時最長的是哪些動作。首先排除其他因素的影響,專註於AnimatedExpandableList本收得使用,我們使用GitHub上原生提供的Example來做分析:這是展開5個子項目的分組的情況,註意5個子分組的view生成,LayoutInflater.inflate被執行了10次,是其兩倍。而inflate是相當耗時的。有沒有方法來減少這部分工作消耗呢?

方法是使用Android推薦的LRU cache來保存childView的。關於LruCache,請見Android的reference documents和training。這裏特別要註意的是,childView在dataSet改變時需要重新生成,而不是在cache中獲得,這裏使用的方法是判斷childView的type。在自己的項目中需要根據情況認真考慮dataSet改變如何更新cache的問題。效果如下所示:inflate的次數減少到5次,壹次都不浪費。消耗時間從160ms降低到80ms。

  • 上一篇:主人梗源代碼
  • 下一篇:什麽樣的漲停股可以追?
  • copyright 2024編程學習大全網