解决首页广告ScrollView 嵌套viewpage 影响viewpager 滑动

来源:互联网 发布:沈阳盘古网络 编辑:程序博客网 时间:2024/05/16 01:24
Scrollview 中嵌套viewpager 影响viewpager横向滑动的原因是viewpager中本身存在的手势事件和scrollview的事件相冲突,解决方法为重写
onScrollChanged 事件,起一个线程,不断判断滑动是否为横向滑动大于纵向滑动,具体代码如下:将
ScrollView 替换成如下的自定义viewpager;
public class PullableScrollView extends ScrollView implements Pullable{private float xDistance, yDistance, xLast, yLast;   int newy=0;   int oldy=-1;   boolean flag=false;   private OnScrollListener onScrollListener;   private PauseOnScrollListener onScrollListeners;   public PullableScrollView(Context context)   {      super(context);   }   public PullableScrollView(Context context, AttributeSet attrs)   {      super(context, attrs);   }   public PullableScrollView(Context context, AttributeSet attrs, int defStyle)   {      super(context, attrs, defStyle);   }   @Override   public boolean canPullDown()   {      if (getScrollY() == 0)         return true;      else         return false;   }   @Override   public boolean canPullUp()   {      if (getScrollY() >= (getChildAt(0).getHeight() - getMeasuredHeight()))         return true;      else         return false;   }   public void setOnScrollListener(OnScrollListener onScrollListener) {      this.onScrollListener = onScrollListener;   }   public void setOnScrollListener(PauseOnScrollListener onScrollListener) {      this.onScrollListeners = onScrollListener;   }   @Override   public int computeVerticalScrollRange() {      return super.computeVerticalScrollRange();   }   @Override   protected void onScrollChanged(int l, int t, int oldl, int oldt) {      super.onScrollChanged(l, t, oldl, oldt);      if(onScrollListener != null){         onScrollListener.onScroll(t);      }      newy=oldt;      if (!flag){         flag=true;         new Thread(new Runnable() {            @Override            public void run() {               thread_run();            }         }).start();      }      Log.e(l+"aaa"+t+"bb",oldl+"ccc"+oldt);if(t==oldt){   if(onScrollListener != null){   }}   }   void thread_run() {      while (flag) {         if (oldy == newy) {            flag = false;            onScrollListener.onstop();         } else {                oldy=newy;         }         try {            Thread.sleep(1000);         } catch (InterruptedException e) {            e.printStackTrace();         }      }   }   /**    *    * 滚动的回调接口    */   public interface OnScrollListener{      /**       * 回调方法, 返回MyScrollView滑动的Y方向距离       * @param scrollY       *                     */      public void onScroll(int scrollY);      public void onstop();   }   @Override   public boolean onInterceptTouchEvent(MotionEvent ev) {      switch (ev.getAction()) {         case MotionEvent.ACTION_DOWN:            xDistance = yDistance = 0f;            xLast = ev.getX();            yLast = ev.getY();            break;         case MotionEvent.ACTION_MOVE:            final float curX = ev.getX();            final float curY = ev.getY();            xDistance += Math.abs(curX - xLast);            yDistance += Math.abs(curY - yLast);            xLast = curX;            yLast = curY;            if (xDistance > yDistance) {               return false;            }      }      return super.onInterceptTouchEvent(ev);   }}

0 0