2、实现的原理 a、根据用户提供的Adapter(主要就两个方法,getCount【决定多少个Item】,getView【每个Item的样子】),根据getCount我会在初始化时,在ScrollView内部LinearLayout中添加对应数量的Item,当然也会根据数量平分屏幕高度; b、监听onTouch方法,当用户触发ACTION_MOVE时,屏幕跟随用户手指上面移动,当达到顶部时,会动态为顶部添加一个Item,同时移除底部最后一个Item;用户滑动到达底部也一样,底部动态添加一个Item,顶部第一个移除;ScrollView内会始终维持用户指定数量+1个Item,为什么加1呢,因为拖动过程中最多会显示+1个Item(第一个一半,最后一个一半) c、监听ACTION_UP,判断如果当然显示小于半个,缩回去;大于半个则慢慢显示出完整的Item; 3、代码分析首先我们定义一个Adapter,用户给用户设置每个Item的样子以及个数;类似ListView的Adapter
[java] view plain copy
- /**
- * 适配器
- * @author zhy
- *
- */
- public static abstract class Adapter
- {
- public abstract View getView(SingleItemScrollView parent, int pos);
-
- public abstract int getCount();
- }
构造方法中得到屏幕的高度
[java] view plain copy
- public SingleItemScrollView(Context context, AttributeSet attrs)
- {
- super(context, attrs);
-
- // 计算屏幕的高度
- WindowManager wm = (WindowManager) context
- .getSystemService(Context.WINDOW_SERVICE);
- DisplayMetrics outMetrics = new DisplayMetrics();
- wm.getDefaultDisplay().getMetrics(outMetrics);
- mScreenHeight = outMetrics.heightPixels;
- mScreenHeight -= getStatusHeight(context);
-
- }
onMeasure中对Item进行添加,以及设置高度
[java] view plain copy
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
- {
- //防止多次调用
- if (!flag)
- {
- mContainer = (ViewGroup) getChildAt(0);
-
- //根据Adapter的方法,为容器添加Item
- if (mAdapter != null)
- {
- mItemCount = mAdapter.getCount();
- mItemHeight = mScreenHeight / mItemCount;
- mContainer.removeAllViews();
- for (int i = 0; i < mAdapter.getCount(); i++)
- {
- addChildView(i);
- }
- }
- addChildView(0);
- }
-
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- }
|