[关闭]
@wangwangheng 2015-06-17T12:51:45.000000Z 字数 4042 阅读 2084

醋溜交接文档

不可发布


一、9块9界面

1、 ScrollView + ViewPager + ListView 触摸事件处理

整体思路 在页面加载完成之后,把ViewPager的高度设置为ScrollView的高度减去Tab的高度,然后在ScrollView、ListView的触摸时间分发上想办法完成想要的功能;

1.1、设置ViewPager的高度

在HomeFragment中,调用时机是页面刷新完成之后:

  1. mScrollView.getViewTreeObserver().addOnGlobalLayoutListener(
  2. new ViewTreeObserver.OnGlobalLayoutListener() {
  3. @Override
  4. public void onGlobalLayout() {
  5. if(!resized && getActivity() != null){
  6. LayoutParams params = mViewPager.getLayoutParams();
  7. // 只能通过屏幕高度设置,当有虚拟键盘的时候有问题
  8. // 为什么要加上底部的虚拟按钮条的高度?因为手机有虚拟按钮
  9. // 有的手机没有;而且,具有虚拟按钮的手机的具体表现还不一样;
  10. int virtualBackBarHeight = CuliuUtils.getScreenHeight()
  11. - getActivity().getWindow().getDecorView().getHeight();
  12. // top bar和bottom bar的高度
  13. int topbarHeight = getResources()
  14. .getDimensionPixelSize(R.dimen.topbar_height);
  15. int bottomBarHeight = getResources()
  16. .getDimensionPixelSize(R.dimen.bottom_bar_height);
  17. int topAndBottomBarHeight = topbarHeight + bottomBarHeight;
  18. LinearLayout.LayoutParams p = (android.widget.LinearLayout.LayoutParams)
  19. mTabs.getLayoutParams();
  20. int margin = p.topMargin + p.bottomMargin
  21. + mTabsBottomDividerView.getHeight();
  22. params.height = CuliuUtils.getScreenHeight() - statusBarHeight -
  23. mTabs.getHeight() - topAndBottomBarHeight
  24. - virtualBackBarHeight - margin;
  25. mViewPager.setLayoutParams(params);
  26. mScrollView.setInterceptParams(mViewPager);
  27. resized = true;
  28. }
  29. }
  30. });

特别注意的是,ViewPager 的高度只要设置一次就行了,所以要有排斥机制,并且在内存被回收之后,要重新设置高度(使用保存了的ViewPager的高度)

1.2、 处理ScrollView和ViewPager之间的触摸事件冲突

主要思路: 在自定义的ScrollView的onInterceptTouchEvent()方法中(MyScrollView),判断手指在屏幕X轴上和Y轴上移动的距离的大小,如果在X轴移动的距离大于在Y轴上移动的距离,则把事件分发到子View上(返回false);否则直接自己处理(返回true)

  1. case MotionEvent.ACTION_DOWN:
  2. xDistance = yDistance = 0f;
  3. lastX = ev.getX();
  4. lastY = ev.getY();
  5. break;
  6. case MotionEvent.ACTION_MOVE:
  7. final float curX = ev.getX();
  8. final float curY = ev.getY();
  9. xDistance += Math.abs(curX - lastX);
  10. yDistance += Math.abs(curY - lastY);
  11. lastX = curX;
  12. lastY = curY;
  13. if(xDistance > yDistance){
  14. return false;
  15. }
  16. break;
  • 因为MyScrollView extends ScrollView , 所以,如果在X轴移动的距离不大于在Y轴移动的距离,会调用ScrollViewonInterceptTouchEvent(),在ACTION_MOVE的时候,如果在Y轴的手指滑动距离大于ViewConfiguration所以定义的最小滑动距离(touchSlop,从这个方法ViewConfiguration.get(context).getScaledTouchSlop()得到)的话,则返回true

  • 这一块内容,可以继续做优化:可以在X轴移动距离大于Y轴距离的时候,添加上X轴移动距离和TouchSlop的比较逻辑

1.3、 处理ScrollView和ListView之间触摸事件冲突

主要思路: 需要处理MyScrollView的onInterceptTouchEvent()以及HomeListView的onTouchEvent以及onScroll方法

  • 通过VelocityTracker得到当前Y轴的移动速度,如果>0说明手指正在往下滑动,如果<0,则说明正在往上滑动;关于VelocityTracker可以参考网上的文章,如Android VelocityTracker简介

  • 得到View的显示区域的方法:
    Rect global = new Rect();
    mNoInterceptView.getGlobalVisibleRect(global);

二、 主界面

2.1、切换Fragment的逻辑

主界面底部Tabbar和Fragment是一一关联的关系,逻辑比较简单,但是有一点需要注意的就是,当内存被干掉之后(onSaveInstanceState()方法),Android其实是会保存Fragment的状态的,所以要在状态恢复(onRestoreInstanceState()或者onCreate()方法)的时候,恢复这些Fragment;否则会导致页面混乱

三、切换IP逻辑

具体的逻辑,可以参考SwitchHostManager

四、订单评论

订单评论页中的店铺评价(EditText中的内容),是在失去焦点的时候设置到保存评价信息的对象中去的,这一点要注意一下

五、新分类

新分类主要使用大荣写的一个通用的列表界面框架,这个可以和大荣沟通

六、Banner

目前主界面中使用的Banner都是BannerFragment来实现的,自动跳转下一个Banner的逻辑都在BannerViewPager类中;

实现无限循环滚动的逻辑可以看一下ViewPager无限循环,并做了优化————到最后一个和第0个切换的时候的逻辑从onPageSelected()方法移动到了onPageScrolled()方法。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注