1. 程式人生 > >通過listview實現自定義TimePicker附帶動畫效果

通過listview實現自定義TimePicker附帶動畫效果

通過listview實現自定義TimePicker

歡迎加安卓開發交流群:308372687(博主儘可能幫助大家)

老規矩先上效果圖:

這裡寫圖片描述

看了這個效果圖,大家不要疑惑,沒錯這就是我們常見的listview。次控制元件沒用重寫listview的程式碼,只不過通過一個adapter實現這種高階效果。下面看看具體的分析實現吧。

幾個要點:

1.如何實現迴圈滾動的listview。
2.如何實現滑動動畫。
3.如果實現多種不同大小的item。

1.如何實現迴圈滾動的listview。

思路:把原有的資料已3倍。對映到listview中。通過onScroll方法,不斷將滑動的位置返回到中間。比如資料是12345。那麼我們的listview資料就是123451234512345。如果我們到了第3個4的位置。那麼就回到第2個4的位置。這樣就實現了迴圈。如果資料量夠大,我們用3倍,如果特別少那麼就可以用5倍甚至7倍來優化滑動迴圈。
程式碼:

@Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        // TODO Auto-generated method stub
        top = firstVisibleItem;
        if (firstVisibleItem <= 2) {
            listView.setSelection(max + 2);
        } else
if (firstVisibleItem + visibleItemCount > m1111.getCount() - 2) { listView.setSelection(firstVisibleItem - max); } }

2.如何實現滑動動畫。

思路:通過listview實現onScrollStateChanged介面,監聽到正在滾動,停止滾動事件。改變相應的item size欄位。並後用通過adapter映射出來。在adapter中的getview方法中實現屬性動畫。

itembean的程式碼:

public
class ItemBean { public String num; public int size; public ItemBean(String num,int size) { this.num=num; this.size=size; } }

滾動重新整理itembean

if (scrollState == SCROLL_STATE_TOUCH_SCROLL && byaotu == false) {

            if (lockforsrcoll == false) {

                dataList.clear();
                for (int i = 0; i < max * 3; i++) {

                    dataList.add(new ItemBean("" + i % max, 0));
                }
                m1111.notifyDataSetChanged();

            }

3.如果實現多種不同大小的item。

思路:仔細觀察gif可以發現,item共有6種形態。最大,小1上,小1下,小2上,小2下,滾動中。我們為這6種形態設定6種不通的size值並在adapter中的getview方法中,進行相應的大小變化從而實現不通的大小item並附帶動畫效果。

比如當size為-1是時。



 if (bean.size==-1) {

            ObjectAnimator a2=ObjectAnimator.ofFloat( holder.numtextview, "scaleX",b(1.2F),b(1F));
            a2.setDuration(CHANGETIME);
            a2.start();
            ObjectAnimator a22=ObjectAnimator.ofFloat( holder.numtextview, "scaleY", b(1.2F),b(1F));
            a22.setDuration(CHANGETIME);

            a22.start();
            ObjectAnimator a33=ObjectAnimator.ofFloat( holder.numtextview, "RotationX", 0,30);
            a33.setDuration(CHANGETIME);

            a33.start();   
            ObjectAnimator.ofFloat(holder.numtextview, "Alpha", 0.4F,0.6F).setDuration(CHANGETIME).start();

               holder.numtextview.setText(bean.num);



            }
這個例子也為了說明,很多效果的實現不一定很死板,程式碼要靈活。不是要效果就一定要去重寫view。谷歌有很多已經為我們封裝好很多東西,大家靈活的去使用吧!

歡迎加安卓開發交流群:308372687(博主儘可能幫助大家)