仿火車出票效果
之前我下載了BaseAnimation 開源庫(BaseAnimation是基於開源的APP,致力於收集各種動畫效果)
BaseAnimation 轉載的鏈接:https://blog.csdn.net/vipzjyno1/article/details/20622621
發現裏麵有個火車票的出票效果,發現可以優化下:
BaseAnimation內的仿出票效果
可是它的出的票的布局高度啥都是寫死的,通過這個思路,我便想到要做個類似於數據是通過網絡獲取,高度不一定的listview的訂單出票效果。
一. 思路:
1)疊在布局上層的是訂單信息,而在下層的就是訂單內菜單的詳細條目,詳細條目的布局是置於布局最底層,並且在訂單信息相對位置下方,這裏使用了FrameLayout來處 理 詳細條目布局。
2)出票的詳細條目列表采用了LISTVIEW,它的動畫初始位置要通過計算LISTVIEW的總高度進行計算獲取,之後通過TranslateAnimation 進行Animation動畫。
3)采用線程來模擬網絡獲取延遲的效果。
二. 碰到解決的問題:
1)碰到一個問題,就是如果數據一多,超過了一屏幕,在動畫過程中動畫銜接效果就很差,並有可能出現斷層效果。
解決:通過重寫ListView, 計算高度,並且在ListView 外麵嵌套了一層ScrollView,這樣便可以解決這樣的問題。
2) 如果在訂單信息布局下方直接放置一個LISTVIEW的話,這樣,動畫時候,LISTVIEW就會蓋在訂單信息上方。
解決:LISTVIEW外層一定要嵌套一層布局,並且設定在訂單信息下方,這樣便不會產生上述問題。
3)由於訂單底部
一開始就是出現的,並且在數據刷新後跟隨LISTVIEW一起下滑。
解決:采用Listview的addFooterView(底部view)方法,把它添加到LISTVIEW底部,在開始添加完畢後就直接初始化讓Listview.setAdapter(null);
這樣便在開始底部就顯示出來了。
4)如何去計算LISTVIEW的總高度
解決:本DEMO采用了2種方式,
第一種:鑒於訂單中每個ITEM的布局都是固定的,於是在布局中設置ITEM的高度為固定值,之後乘以listAdapter.getCount() 加上分割線listView.getDividerHeight() 的總高度
第二種:如果每個ITEM的布局是高度是不一定的話,就會造成影響,便找了一些資料,使用了以下方法:
- /** ListView 總高度 */
- public static int totalHeight = 0;
- public static void setListViewHeightBasedOnChildren(ListView listView) {
- ListAdapter listAdapter = listView.getAdapter();
- if (listAdapter == null) {
- return;
- }
- totalHeight = 0;
- // 由於ADD了個footer,所以總量減去1
- Log.d("listAdapter.getCount()", "" + listAdapter.getCount());
- for (int i = 0, len = listAdapter.getCount() - 1; i < len; i++) {
- View listItem = listAdapter.getView(i, null, listView);
- listItem.measure(0, 0);
- totalHeight += listItem.getMeasuredHeight();
- Log.d("getMeasuredHeight", "" + listItem.getMeasuredHeight());
- }
- totalHeight = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
- }
計算得到了總高度。
5)實現動畫效果
解決:
- /**
- * 啟動打印訂單動畫
- */
- rivate void startAnimation() {
- anim = new TranslateAnimation(0.0f, 0.0f, -totalHeight, 0);
- anim.setDuration(1000);
- anim.setFillAfter(true);
- anim.setAnimationListener(new AnimationListener() {
- @Override
- public void onAnimationStart(Animation animation) {
- // TODO Auto-generated method stub
- }
- @Override
- public void onAnimationRepeat(Animation animation) {
- // TODO Auto-generated method stub
- }
- @Override
- public void onAnimationEnd(Animation animation) {
- // TODO Auto-generated method stub
- cListview.clearAnimation();
- }
- });
- cListview.startAnimation(anim);
最後來看看動畫效果把:
由於是第一次寫博客,有不足之處望各位大神提出意見和建議,共同進步。謝謝!
轉載請附上:https://blog.csdn.net/vipzjyno1/article/details/20623401
DEMO源碼下載鏈接:
https://download.csdn.net/detail/vipzjyno1/7000355最後更新:2017-04-03 12:56:16