Bạn cần phải phân lớp ViewPager
. onTouchEvent
có rất nhiều điều hay trong đó mà bạn không muốn thay đổi như cho phép quan điểm của trẻ em được chạm vào. onInterceptTouchEvent
là những gì bạn muốn thay đổi. Nếu bạn nhìn vào mã cho ViewPager
, bạn sẽ thấy nhận xét:
/*
* This method JUST determines whether we want to intercept the motion.
* If we return true, onMotionEvent will be called and we do the actual
* scrolling there.
*/
Đây là một giải pháp hoàn chỉnh:
Đầu tiên, thêm lớp này vào src
thư mục của bạn :
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.animation.DecelerateInterpolator;
import android.widget.Scroller;
import java.lang.reflect.Field;
public class NonSwipeableViewPager extends ViewPager {
public NonSwipeableViewPager(Context context) {
super(context);
setMyScroller();
}
public NonSwipeableViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
setMyScroller();
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
// Never allow swiping to switch between pages
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// Never allow swiping to switch between pages
return false;
}
//down one is added for smooth scrolling
private void setMyScroller() {
try {
Class<?> viewpager = ViewPager.class;
Field scroller = viewpager.getDeclaredField("mScroller");
scroller.setAccessible(true);
scroller.set(this, new MyScroller(getContext()));
} catch (Exception e) {
e.printStackTrace();
}
}
public class MyScroller extends Scroller {
public MyScroller(Context context) {
super(context, new DecelerateInterpolator());
}
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
super.startScroll(startX, startY, dx, dy, 350 /*1 secs*/);
}
}
}
Tiếp theo, hãy đảm bảo sử dụng lớp này thay vì thông thường ViewPager
, mà bạn có thể đã chỉ định là android.support.v4.view.ViewPager
. Trong tệp bố cục của bạn, bạn sẽ muốn chỉ định nó với một cái gì đó như:
<com.yourcompany.NonSwipeableViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
Ví dụ cụ thể này là trong một LinearLayout
và có nghĩa là chiếm toàn bộ màn hình, đó là lý do tại sao layout_weight
là 1 và layout_height
là 0dp.
Và setMyScroller();
phương pháp là để chuyển tiếp suôn sẻ