viewpager+fragment+viewpager+scrollview滑動衝突問題
阿新 • • 發佈:2019-02-04
我的佈局比較複雜,viewpager裡面是fragment,fragment裡面有事viewpager,viewpager裡面有事fragment,fragment裡面是scrollview,scrollview裡面是viewpager和listview不要問我為什麼這麼複雜,想想就蛋疼。。。
在這裡面能滑動的有viewpager和scrollview,那麼當我們滑動的時候到底哪個滑動,這是個問題,這裡解決的是裡層viewpager滑動時,外層viewpager和scrollview不滑動(其實scrollview影響不大,但是不禁止的話,viewpager左右滑動的時候稍微有一點上下動,就會出發scrollview的滑動,從而viewpager的左右滑動就失敗啦。所以把scrollview也禁止啦),解決辦法就是自定義一個viewpager
程式碼如下:
package com.mydrivernews.tools;
import android.content.Context;
import android.graphics.PointF;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewParent;
public class ImageViewPager extends ViewPager {
public ImageViewPager(Context arg0, AttributeSet arg1) {
super(arg0, arg1);
}
public ImageViewPager(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
PointF downPoint = new PointF();
OnSingleTouchListener onSingleTouchListener;
@Override
public boolean onTouchEvent(MotionEvent evt) {
/**
*這裡是我的佈局結構,每次getParent()就得到他外邊的佈局,scrollview或viwepager和這個viewpager直接有幾層佈局,就用幾個getParent()
**/
ViewParent p=getParent().getParent().getParent();
//外層的viewpager取消攔截
ViewParent p2=getParent().getParent().getParent().getParent().getParent();
switch (evt.getAction()) {
case MotionEvent.ACTION_DOWN:
// 記錄按下時候的座標
downPoint.x = evt.getX();
downPoint.y = evt.getY();
if (this.getChildCount() > 1) { // 有內容,多於1個時
// 通知其父控制元件,現在進行的是本控制元件的操作,不允許攔截
p.requestDisallowInterceptTouchEvent(true);
p2.requestDisallowInterceptTouchEvent(true);
}
break;
case MotionEvent.ACTION_MOVE:
if (this.getChildCount() > 1) { // 有內容,多於1個時
// 通知其父控制元件,現在進行的是本控制元件的操作,不允許攔截
p.requestDisallowInterceptTouchEvent(true);
p2.requestDisallowInterceptTouchEvent(true);
}
break;
case MotionEvent.ACTION_UP:
// 在up時判斷是否按下和鬆手的座標為一個點
if (PointF.length(evt.getX() - downPoint.x, evt.getY() - downPoint.y) < (float) 5.0) {
onSingleTouch(this);
return true;
}
break;
}
return super.onTouchEvent(evt);
}
public void onSingleTouch(View v) {
if (onSingleTouchListener != null) {
onSingleTouchListener.onSingleTouch(v);
}
}
public interface OnSingleTouchListener {
public void onSingleTouch(View v);
}
public void setOnSingleTouchListener(OnSingleTouchListener onSingleTouchListener) {
this.onSingleTouchListener = onSingleTouchListener;
}
}