通过listview实现自定义TimePicker附带动画效果

来源:互联网 发布:cocostudio 1.6 mac 编辑:程序博客网 时间:2024/05/21 01:54

通过listview实现自定义TimePicker

转载请注明来源
代码连接
https://github.com/AndroidMsky/MyPickerView

欢迎加安卓开发交流群: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。谷歌有很多已经为我们封装好很多东西,大家灵活的去使用吧!

转载请注明来源
代码连接
https://github.com/AndroidMsky/MyPickerView

欢迎加安卓开发交流群:308372687(博主尽可能帮助大家)

1 0
原创粉丝点击