ViewPager2嵌套ViewPager再嵌套GridView
效果圖
效果圖
先重寫ViewPager
如果用onInterceptTouchEvent攔截會導致GridView的item不能點擊烤送,所以用dispatchTouchEvent進行攔截
int downX = 0;
? ? int downY = 0;
? ? @Override
? ? public boolean dispatchTouchEvent(MotionEvent ev) {
? ? ? ? //int downX = 0;? ? ? ? 這里賦值downX,downY會一直為0;要轉(zhuǎn)為成員變量
? ? ? ? // int downY = 0;
? ? ? ? //y軸方向需要考慮移動整個模塊,讓其支持下拉刷新
? ? ? ? //在用系統(tǒng)的事件處理機制之前,先讓自定義的viewpager滿足我們自己定義的規(guī)則
? ? ? ? //viewpager選中最后一個點的時候,由右向左滑動,需要讓整個模塊進行翻轉(zhuǎn)
? ? ? ? //viewpager選中第一個點的時候,由左向右滑動,需要讓整個模塊進行翻轉(zhuǎn)
? ? ? ? //其余情況,翻轉(zhuǎn)viewpager中的圖片
? ? ? ? switch (ev.getAction()){
? ? ? ? ? ? case MotionEvent.ACTION_DOWN:
? ? ? ? ? ? ? ? downX = (int) ev.getX();
? ? ? ? ? ? ? ? downY = (int) ev.getY();
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case MotionEvent.ACTION_MOVE:
? ? ? ? ? ? ? ? int moveX = (int) ev.getX();
? ? ? ? ? ? ? ? int moveY = (int) ev.getY();
? ? ? ? ? ? ? ? if(Math.abs(moveX-downX)<Math.abs(moveY-downY)){
? ? ? ? ? ? ? ? ? ? //y軸上的偏移量比x軸上的偏移量更多,可能會觸發(fā)下拉刷新,需要響應事件的是大的模塊
? ? ? ? ? ? ? ? ? ? //請求不攔截觸摸事件(不是這樣的,要攔截)
? ? ? ? ? ? ? ? ? ? getParent().requestDisallowInterceptTouchEvent(false);//讓viewpager告知其父容器要攔截響應事件
? ? ? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? ? //x軸偏移量大于y軸偏移量情況
? ? ? ? ? ? ? ? ? ? if (moveX-downX<0){
? ? ? ? ? ? ? ? ? ? ? ? //由右向左移動,最后一個點,翻轉(zhuǎn)整個模塊
? ? ? ? ? ? ? ? ? ? ? ? if (getCurrentItem() == getAdapter().getCount()-1){
? ? ? ? ? ? ? ? ? ? ? ? ? ? getParent().requestDisallowInterceptTouchEvent(false);//讓viewpager告知其父容器要攔截響應事件
? ? ? ? ? ? ? ? ? ? ? ? }else if (getCurrentItem()<getAdapter().getCount()-1){
? ? ? ? ? ? ? ? ? ? ? ? ? ? getParent().requestDisallowInterceptTouchEvent(true);//讓viewpager告知其父容器不要攔截響應事件
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? ? ? ? //由左向右移動,第一個點,翻轉(zhuǎn)整個模塊
? ? ? ? ? ? ? ? ? ? ? ? if (getCurrentItem() == 0){
? ? ? ? ? ? ? ? ? ? ? ? ? ? getParent().requestDisallowInterceptTouchEvent(false);//讓viewpager告知其父容器要攔截響應事件
? ? ? ? ? ? ? ? ? ? ? ? }else if (getCurrentItem()>0){
? ? ? ? ? ? ? ? ? ? ? ? ? ? getParent().requestDisallowInterceptTouchEvent(true);//讓viewpager告知其父容器不要攔截響應事件
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? return super.dispatchTouchEvent(ev);
? ? }