ViewPager (サポート ライブラリ) を使用しています。ViewPager が表示されているページを変更するたびに、左または右にスクロールしていることを知りたいです。
解決策を教えてください。推薦も大歓迎です。
ありがとう
ViewPager (サポート ライブラリ) を使用しています。ViewPager が表示されているページを変更するたびに、左または右にスクロールしていることを知りたいです。
解決策を教えてください。推薦も大歓迎です。
ありがとう
setOnPageChangeListener
あなたに設定ViewPager
変数をグローバルに保つ
private int lastPosition = 0;
そして
@Override
public void onPageSelected(int arg0) {
if (lastPosition > position) {
System.out.println("Left");
}else if (lastPosition < position) {
System.out.println("Right");
}
lastPosition = position;
}
クラスメンバー変数を保持して、最後にアクセスしたページを保存できます
private int mLastVisitedPageIndex = 0;
次に、次の関数を使用して方向を確認します
@Override
public void onPageSelected(int i) {
boolean isMovingForward = mLastVisitedPageIndex < i?true:false;
//Use isMovingForward variable anywhere now
mLastVisitedPageIndex = i;
}
インターフェイスを使用しViewPager.OnPageChangeListener
ます。に渡された position 引数を使用してonPageSelected
、それを前の値と比較して、 がどちらの方向ViewPager
にスクロールされたかを把握できます。
swipeLeft() および swipeRight() メソッドを含めることができ、その onTouchEvent(MotionEvent event) メソッドに ACTION_MOVE および ACTION_CANCEL ケースを含めることができる Custom Viewpager を使用してこれを行うこともできます。
// 役立つ場合は、これがコードになる可能性があります。
public class SwiperViewPager extends ViewPager {
SwiperListener mSwiperListener;
private float downX;
private float downY;
private boolean isTouchCaptured;
private float upX1;
private float upY1;
private float upX2;
private float upY2;
public SwiperViewPager(Context context) {
super(context);
}
public SwiperViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
private float x1, x2;
static final int min_distance = 20;
boolean eventSent = false;
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE: {
downX = event.getX();
downY = event.getY();
if (!isTouchCaptured) {
upX1 = event.getX();
upY1 = event.getY();
isTouchCaptured = true;
} else {
upX2 = event.getX();
upY2 = event.getY();
float deltaX = upX1 - upX2;
float deltaY = upY1 - upY2;
//HORIZONTAL SCROLL
if (Math.abs(deltaX) > Math.abs(deltaY)) {
if (Math.abs(deltaX) > min_distance) {
// left or right
if (deltaX < 0) {
if(!eventSent && mSwiperListener!=null){
mSwiperListener.onLeftSwipe();
eventSent = true;
}
}
if (deltaX > 0) {
if(!eventSent && mSwiperListener!=null){
if(mSwiperListener.onRightSwipe()){
eventSent = true;
return false;
}
}
}
} else {
//not long enough swipe...
}
}
//VERTICAL SCROLL
else {
if (Math.abs(deltaY) > min_distance) {
// top or down
if (deltaY < 0) {
}
if (deltaY > 0) {
}
} else {
//not long enough swipe...
}
}
}
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:{
isTouchCaptured = false;
eventSent = false;
}
}
return super.onTouchEvent(event);
}
public void setmSwiperListener(SwiperListener mSwiperListener) {
this.mSwiperListener = mSwiperListener;
}
public static interface SwiperListener {
public boolean onLeftSwipe();
public boolean onRightSwipe();
}
}
この実装で問題を解決しました。それが役に立てば幸い。
public static final float EPSILON= 0.001f;
@Override
public void onPageScrolled(final int position, final float positionOffset, final int positionOffsetPixels) {
// initial position (positionOffset == 0)
if (positionOffset < EPSILON) {
mIsRight = positionOffset < 0.5;
return;
}
// code here
if (mIsRight) {
} else {
}
}
スクロール方向が起こっている間に知ることができる方法は次のとおりです。に を設定するだけOnPageChangeCallback()
ですViewPager
。の現在のページを保存ViewPager
し、 のパラメータOnPageSelected()
と比較します。現在のページが より小さいか等しい場合は右にスクロールし、そうでない場合は左にスクロールします。position
OnPageScrolled()
position
var currentPage = 0
viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
currentPage = position
}
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
super.onPageScrolled(position, positionOffset, positionOffsetPixels)
if (currentPage <= position) {
// We are scrolling right
} else {
// We are scrolling left
}
}
})
pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if(position == pager.getCurrentItem()){
// Move Right
}
else{
// Move Left
}
}