source

ViewPager에서 손가락으로 스와이프하여 페이징을 비활성화하면서 프로그래밍 방식으로 스와이프할 수 있는 방법은 무엇입니까?

factcode 2023. 6. 8. 22:38
반응형

ViewPager에서 손가락으로 스와이프하여 페이징을 비활성화하면서 프로그래밍 방식으로 스와이프할 수 있는 방법은 무엇입니까?

저는 ViewPager를 가지고 있고 그 아래에는 10개의 버튼이 있습니다. 버튼을 가 #페이지로 합니다. #4는 #4입니다.mPager.setCurrentItem(3);그러나 손가락으로 가로로 스와이프하여 페이징을 비활성화하고 싶습니다.따라서 페이징은 버튼을 클릭하는 것만으로 수행됩니다.그렇다면, 손가락으로 스와이핑을 비활성화하려면 어떻게 해야 합니까?

하위 클래스로 분류해야 합니다.ViewPager.onTouchEvent아이들이 볼 수 있도록 하는 것처럼 바꾸고 싶지 않은 좋은 점들이 많이 들어 있습니다. onInterceptTouchEvent당신이 바꾸고 싶은 것입니다.코드를 보면 다음과 같습니다.ViewPager다음과 같은 댓글이 표시됩니다.

    /*
     * 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.
     */

완벽한 솔루션은 다음과 같습니다.

먼저, 이 클래스를 당신의 클래스에 추가합니다.src폴더:

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*/);
        }
    }
}

다음으로, 정규 수업 대신에 이 수업을 사용해야 합니다.ViewPager이 아도당지정것으로 했을 것입니다.android.support.v4.view.ViewPager레이아웃 파일에서 다음과 같은 방법으로 지정할 수 있습니다.

<com.yourcompany.NonSwipeableViewPager
    android:id="@+id/view_pager"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1" />

는 이특한다같습다니과음에 .LinearLayout을 차지하는 을 의미하기 에 전화체차되있어록고이도다, 그이입니유것그리지하고면.layout_weight이고 "1"입니다.layout_height0dp.0dp입니다.

그리고 원활한 전환을 위한 방법입니다.

의 더 .ViewPager 것입니다.SetPagingEnabled호출을 즉시 활성화하거나 비활성화할 수 있는 방법입니다. 두을 덮어씁니다.onTouchEvent그리고.onInterceptTouchEvent페이징이 비활성화된 경우 둘 다 "false"를 반환합니다.

public class CustomViewPager extends ViewPager {

    private boolean enabled;

    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.enabled = true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (this.enabled) {
            return super.onTouchEvent(event);
        }

        return false;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        if (this.enabled) {
            return super.onInterceptTouchEvent(event);
        }

        return false;
    }

    public void setPagingEnabled(boolean enabled) {
        this.enabled = enabled;
    } 
}

그런 다음 XML의 기본 제공 보기 페이지 대신 이 페이지를 선택합니다.

<mypackage.CustomViewPager 
    android:id="@+id/myViewPager" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" />

당신은 그냥 전화하면 됩니다.setPagingEnabled이 있는 방법.false페이지로 이동할 수 없습니다.

이제 사용자 지정을 생성할 필요가 없습니다.ViewPager

Android에서 사용할 수 있는 새 이름 View

수직 방향 지원

  • ViewPager2에서는 기존의 수평 페이징 외에도 수직 페이징을 지원합니다.할 수 .ViewPager2의 소를설정을 합니다.android:orientation속성

XML 사용

<androidx.viewpager2.widget.ViewPager2
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:orientation="vertical" />

코드 사용

스을비화면에서 을 사용하지 설정하려면 하십시오.viewpager2사용하다

viewPager2.setUserInputEnabled(false);

인 활면려하에서 viewpager2사용하다

viewPager2.setUserInputEnabled(true);

자세한 내용은 이것을 확인하십시오.

갱신하다

가장 간단한 방법은 하는 것입니다.setOnTouchListener그리고 돌아옴true위해서ViewPager.

mPager.setOnTouchListener(new OnTouchListener()
    {           
        @Override
        public boolean onTouch(View v, MotionEvent event)
        {
            return true;
        }
    });

지정만만 onTouchEvent그리고.onInterceptTouchEvent다른 ViewPager 내부에 ViewPager 자체가 있는 경우에는 충분하지 않습니다.Child ViewPager는 첫 페이지/마지막 페이지에 위치하지 않는 한 상위 ViewPager에서 수평 스크롤 터치 이벤트를 훔칩니다.

하려면 " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "canScrollHorizontally방법.

» LockableViewPager이하의 실시.

public class LockableViewPager extends ViewPager {

    private boolean swipeLocked;

    public LockableViewPager(Context context) {
        super(context);
    }

    public LockableViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public boolean getSwipeLocked() {
        return swipeLocked;
    }

    public void setSwipeLocked(boolean swipeLocked) {
        this.swipeLocked = swipeLocked;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return !swipeLocked && super.onTouchEvent(event);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return !swipeLocked && super.onInterceptTouchEvent(event);
    }

    @Override
    public boolean canScrollHorizontally(int direction) {
        return !swipeLocked && super.canScrollHorizontally(direction);
    }

}

xml에서 속성을 변경할 수 있도록 스타일 가능하다고 선언하는 것이 좋습니다.

private boolean swipeable;

public MyViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyViewPager);
    try {
        swipeable = a.getBoolean(R.styleable.MyViewPager_swipeable, true);
    } finally {
        a.recycle();
    }
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    return swipeable ? super.onInterceptTouchEvent(event) : false;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    return swipeable ? super.onTouchEvent(event) : false;
}

값/attr.xml에서 다음을 수행합니다.

<declare-styleable name="MyViewPager">
  <attr name="swipeable" format="boolean" />
</declare-styleable>

레이아웃 xml에서 사용할 수 있습니다.

<mypackage.MyViewPager
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/viewPager"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:swipeable="false" />

물론 get/set 속성은 계속 유지할 수 있습니다.

ViewPager에서 확장하는 경우 이전에 @araks에서 표시한 대로 재정의해야 합니다.

@Override
public boolean executeKeyEvent(KeyEvent event)
{
    return isPagingEnabled ? super.executeKeyEvent(event) : false;
}

Galaxy Tab 4 10'과 같은 일부 장치는 대부분의 장치가 표시하지 않는 다음과 같은 버튼을 표시하기 때문입니다.

키보드 단추

스와이프를 비활성화하려면

mViewPager.beginFakeDrag();

스와이프 활성화 방법

mViewPager.endFakeDrag();

특정 페이지에서 스와이핑을 비활성화하고 고무줄 애니메이션을 제공해야 했습니다. 다음과 같습니다.

    mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageScrolled(int position, float positionOffset,
                                   int positionOffsetPixels) {
            if (position == MANDATORY_PAGE_LOCATION && positionOffset > 0.5) {
                mViewPager.setCurrentItem(MANDATORY_PAGE_LOCATION, true);
            }
        }

나는 썼습니다.CustomViewPager스위핑 컨트롤 포함:

public class ScrollableViewPager extends ViewPager {
    private boolean canScroll = true;
    public ScrollableViewPager(Context context) {
        super(context);
    }
    public ScrollableViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public void setCanScroll(boolean canScroll) {
        this.canScroll = canScroll;
    }
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return canScroll && super.onTouchEvent(ev);
    }
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return canScroll && super.onInterceptTouchEvent(ev);
    }
}

설정하는 경우canScrolltrue은, 네가 생각하는 것입니다.ViewPager 수도 락으로닦수있고도을손가,있,,false반대로

저는 이것을 제 프로젝트에 사용하고 있으며, 지금까지 잘 작동합니다.

ViewPager2를 사용하는 경우 다음을 사용하면 됩니다.

viewpager.setUserInputEnabled(false);

문서에서:

사용자가 시작한 스크롤을 활성화하거나 비활성화합니다.여기에는 터치 입력(스크롤 및 던지기 제스처) 및 접근성 입력이 포함됩니다.키보드 입력 비활성화는 아직 지원되지 않습니다.사용자가 시작한 스크롤이 비활성화된 경우에도 setCurrentItem을 통한 프로그램 스크롤은 계속 작동합니다.기본적으로 사용자가 시작한 스크롤은 사용 가능합니다.

감사합니다: https://stackoverflow.com/a/61685871/9026710

이것을 게시하는 것이 매우 늦었다는 것을 알지만, 당신의 결과를 달성하기 위한 작은 해킹이 있습니다;)

보기 페이지 아래에 더미 보기를 추가하기만 하면 됩니다.

<android.support.v4.view.ViewPager
     android:layout_width="match_parent"
     android:layout_height="match_parent">
</android.support.v4.view.ViewPager>

<RelativeLayout
     android:id="@+id/dummyView"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
</RelativeLayout>

그런 다음 a를 추가합니다.OnClickListener의 신에게에.RelativeLayout.

dummyView = (RelativeLayout) findViewById(R.id.dummyView);

dummyView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
         //Just leave this empty
    }
});

레이아웃, 배치 및 행동에 대해 조금 창의적으로 생각하면 상상하는 모든 것을 수행할 수 있는 방법을 찾을 수 있습니다:)

행운을 빕니다.

코틀린으로

viewPagerNavigation.isUserInputEnabled = false

저는 이 수업을 성공적으로 사용했습니다.executeKeyEvent를 재정의하여 일부 장치에서 화살표를 사용하거나 액세스 가능성을 위해 스위프하지 않도록 해야 합니다.

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.MotionEvent;

public class ViewPagerNoSwipe extends ViewPager {
    /**
     * Is swipe enabled
     */
    private boolean enabled;

    public ViewPagerNoSwipe(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.enabled = false; // By default swiping is disabled
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return this.enabled ? super.onTouchEvent(event) : false;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return this.enabled ? super.onInterceptTouchEvent(event) : false;
    }

    @Override
    public boolean executeKeyEvent(KeyEvent event) {
        return this.enabled ? super.executeKeyEvent(event) : false;
    }

    public void setSwipeEnabled(boolean enabled) {
        this.enabled = enabled;
    }

}

그리고 xml에서는 다음과 같이 부릅니다.

<package.path.ViewPagerNoSwipe
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

코틀린에서, 위의 답변들을 결합한 저의 해결책입니다.

class CustomViewPager(context: Context, attrs: AttributeSet): ViewPager(context, attrs) {
    var swipeEnabled = false

    override fun onTouchEvent(ev: MotionEvent?): Boolean {
        return if (swipeEnabled) super.onTouchEvent(ev) else false
    }

    override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
        return if (swipeEnabled) super.onInterceptTouchEvent(ev) else false
    }

    override fun executeKeyEvent(event: KeyEvent): Boolean {
        return if (swipeEnabled) super.executeKeyEvent(event) else false
    }
}

kotlin에서는 ViewPager 클래스를 상속하는 사용자 지정 위젯을 만들고 스와이프 동작을 제어하기 위한 플래그 값을 추가하여 이 문제를 해결할 수 있습니다.

SwipePager.kt가 없습니다.

class NoSwipePager(context: Context, attrs: AttributeSet) : ViewPager(context, attrs) {

    var pagingEnabled: Boolean = false

    override fun onTouchEvent(event: MotionEvent): Boolean {
        return if (this.pagingEnabled) {
            super.onTouchEvent(event)
        } else false
    }

    override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
        return if (this.pagingEnabled) {
            super.onInterceptTouchEvent(event)
        } else false
    }
}

xml 단위

<your.package.NoSwipePager
    android:id="@+id/view_pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@id/tab_layout" />

프로그래밍적으로 스위핑을 비활성화합니다.한다면kotlin-android-extensions플러그인은 build.gradle에 적용되며 아래 코드를 작성하여 스위핑을 해제할 수 있습니다.

view_pager.pagingEnabled = false

그렇지 않으면 아래 코드를 사용하여 스위핑을 비활성화할 수 있습니다.

val viewPager : ViewPager = findViewById(R.id.view_pager)
viewPager.pagingEnabled = false

인터셉트에서 재정의하고 true를 반환합니다.TouchEvent() 및/또는 onTouchEvent()누르면 호출기의 터치 이벤트가 소모됩니다.

위의 코드 중 어느 것도 원활하게 작동하지 않습니다. 저는 이것을 시도했습니다.

<HorizontalScrollView
                    android:id="@+id/horizontalScrollView"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:fillViewport="true">

                    <android.support.v4.view.ViewPager
                        android:id="@+id/pager"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent" />
                </HorizontalScrollView>

특정 페이지(이 예에서는 2페이지)에서 스위핑을 비활성화하는 또 다른 쉬운 해결책:

int PAGE = 2;
viewPager.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
        if (viewPager.getCurrentItem() == PAGE) {
                viewPager.setCurrentItem(PAGE-1, false);
                viewPager.setCurrentItem(PAGE, false);
                return  true;
        }
        return false;
}
This worked for me

viewPager.setOnTouchListener(new View.OnTouchListener() {
                                         @Override
                                         public boolean onTouch(View v, MotionEvent event) {
                                             if (viewPager.getCurrentItem() == 0) {
                                                 viewPager.setCurrentItem(-1, false);
                                                 return true;
                                             }
                                             else if (viewPager.getCurrentItem() == 1) {
                                                 viewPager.setCurrentItem(1, false);
                                                 return true;
                                             }
                                             else if (viewPager.getCurrentItem() == 2) {
                                                 viewPager.setCurrentItem(2, false);
                                                 return true;
                                             }
                                             return true;
                                         }
                                     });

이미지 갤러리를 작성하는 경우ImageView모래땅ViewPager확대/축소 및 이동을 지원하는 간단한 솔루션인 Phimme Android(및 Github 샘플 - PhotoView)에서 기본 보기 페이지를 확장하여 확대/축소 가능한 이미지 보기 구현을 참조하십시오.이 솔루션은 작동하지 않습니다.ViewPager

public class CustomViewPager extends ViewPager {
    public CustomViewPager(Context context) {
        super(context);
    }

    public CustomViewPager(Context context, AttributeSet attrs)
    {
        super(context,attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        try {
            return super.onInterceptTouchEvent(event);
        } catch (IllegalArgumentException e) {
            return false;
        }
    }
}
* NonSwipebleViewPager for kotlin
    
import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.animation.DecelerateInterpolator
import android.widget.Scroller
import androidx.viewpager.widget.ViewPager
import java.lang.reflect.Field


class NonSwipebleViewPager : ViewPager {
    constructor(context: Context?) : super(context!!) {
        setMyScroller()
    }

    constructor(context: Context?, attrs: AttributeSet?) : super(context!!, attrs) {
        setMyScroller()
    }

    override fun onInterceptTouchEvent(event: MotionEvent): Boolean { 
        return false
    }

    override fun onTouchEvent(event: MotionEvent): Boolean { 
        return false
    }

    private fun setMyScroller() {
        try {
            val viewpager: Class<*> = ViewPager::class.java
            val scroller: Field = viewpager.getDeclaredField("mScroller")
            scroller.isAccessible = true
            scroller.set(this, MyScroller(context))
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

    inner class MyScroller(context: Context?) :
        Scroller(context, DecelerateInterpolator()) {
        override fun startScroll(
            startX: Int,
            startY: Int,
            dx: Int,
            dy: Int,
            duration: Int
        ) {
            super.startScroll(startX, startY, dx, dy, 350 /*1 secs*/)
        }
    }
}

사용자 손가락에서 가로 또는 세로 스크롤을 원하지 않는 경우 다음을 시도할 수 있습니다.

yourViewPager.isUserInputEnabled = false

isUserInputEnabled를 사용합니다.

만약 당신이 사마린에서 안드로이드에 동일한 것을 구현하고 싶다면, 여기 C#로 번역된 것이 있습니다.

속성 이름을 "ScrollEnabled"로 지정했습니다.왜냐하면 iOS는 excat 같은 이름을 사용하기 때문입니다.따라서 두 플랫폼 모두에서 동일한 이름을 사용할 수 있으므로 개발자가 더 쉽게 사용할 수 있습니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Support.V4.View;
using Android.Util;

namespace YourNameSpace.ViewPackage {

    // Need to disable swiping for ViewPager, if user performs Pre DSA and the dsa is not completed yet
    // http://stackoverflow.com/questions/9650265/how-do-disable-paging-by-swiping-with-finger-in-viewpager-but-still-be-able-to-s
    public class CustomViewPager: ViewPager {
        public bool ScrollEnabled;

        public CustomViewPager(Context context, IAttributeSet attrs) : base(context, attrs) {
            this.ScrollEnabled = true;
        }

        public override bool OnTouchEvent(MotionEvent e) {
            if (this.ScrollEnabled) {
                return base.OnTouchEvent(e);
            }
            return false;
        }

        public override bool OnInterceptTouchEvent(MotionEvent e) {
            if (this.ScrollEnabled) {
                return base.OnInterceptTouchEvent(e);
            }
            return false;
        }

        // For ViewPager inside another ViewPager
        public override bool CanScrollHorizontally(int direction) {
            return this.ScrollEnabled && base.CanScrollHorizontally(direction);
        }

        // Some devices like the Galaxy Tab 4 10' show swipe buttons where most devices never show them
        // So, you could still swipe through the ViewPager with your keyboard keys
        public override bool ExecuteKeyEvent(KeyEvent evt) {
            return this.ScrollEnabled ? base.ExecuteKeyEvent(evt) : false;
        }
    }
}

.axml 파일에서:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
  <YourNameSpace.ViewPackage.CustomViewPager
      android:id="@+id/pager"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:background="@android:color/white"
      android:layout_alignParentTop="true" />
</LinearLayout>

이 저의 입니다.
하고 애니메이션 수 .

1-불규칙ViewpageronInterceptTouchEvent그리고.onTouchEvent

나만것만기들을 만듭니다.GestureDetector

3 - 스와이프 제스처를 감지하고 다음을 사용합니다.setCurrentItem(item, false)

페이지 보기

public class ViewPagerNoSwipe extends ViewPager {
    private final GestureDetector gestureDetector;
    private OnSwipeListener mOnSwipeListener;

    public void setOnSwipeListener(OnSwipeListener onSwipeListener) {
        mOnSwipeListener = onSwipeListener;
    }

    public ViewPagerNoSwipe(@NonNull Context context) {
        super(context);
        gestureDetector = new GestureDetector(context, new GestureListener());

    }

    public ViewPagerNoSwipe(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        gestureDetector = new GestureDetector(context, new GestureListener());


    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return true;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        gestureDetector.onTouchEvent(ev);
        return false;
    }

    public class GestureListener extends GestureDetector.SimpleOnGestureListener {

        private static final int SWIPE_THRESHOLD = 100;
        private static final int SWIPE_VELOCITY_THRESHOLD = 100;

        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            boolean result = false;
            try {
                float diffY = e2.getY() - e1.getY();
                float diffX = e2.getX() - e1.getX();
                if (Math.abs(diffX) > Math.abs(diffY)) {
                    if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                        if (diffX > 0) {
                            if(mOnSwipeListener!=null)
                            mOnSwipeListener.onSwipeRight();
                        } else {
                            if(mOnSwipeListener!=null)
                                mOnSwipeListener.onSwipeLeft();
                        }
                        result = true;
                    }
                } else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                    if (diffY > 0) {
                        if(mOnSwipeListener!=null)
                            mOnSwipeListener.onSwipeBottom();
                    } else {
                        if(mOnSwipeListener!=null)
                            mOnSwipeListener.onSwipeTop();
                    }
                    result = true;
                }
            } catch (Exception exception) {
                exception.printStackTrace();
            }
            return result;
        }
    }

    public interface OnSwipeListener {

         void onSwipeRight();

        void onSwipeLeft();

        void onSwipeTop();

        void onSwipeBottom();
    }
}

ViewPager를 설정하면 sweepListener를 설정합니다.

postsPager.setOnSwipeListener(new ViewPagerNoSwipe.OnSwipeListener() {
            @Override
            public void onSwipeRight() {

              postsPager.setCurrentItem(postsPager.getCurrentItem() + 1,false);

            }

            @Override
            public void onSwipeLeft() {

            postsPager.setCurrentItem(postsPager.getCurrentItem() - 1, false);

            }
             ...
           }

나는 뷰페이지를 조금 커스터마이즈하고 스위핑을 쉽게 해제할 뿐입니다.

public class CustomViewPager extends ViewPager {

private boolean swipeLocked;

public CustomViewPager(Context context) {
    super(context);
}

public CustomViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public boolean getSwipeLocked() {
    return swipeLocked;
}

public void setSwipeLocked(boolean swipeLocked) {
    this.swipeLocked = swipeLocked;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    return !swipeLocked && super.onTouchEvent(event);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    return !swipeLocked && super.onInterceptTouchEvent(event);
}

@Override
public boolean canScrollHorizontally(int direction) {
    return !swipeLocked && super.canScrollHorizontally(direction);
}
}
shareViewPager?.setOnTouchListener(object :View.OnTouchListener{
            override fun onTouch(v: View?, event: MotionEvent?): Boolean {
                for (PAGE in 0..shareViewPager.adapter!!.count){
                    if (shareViewPager.currentItem==PAGE){
                        shareViewPager.setCurrentItem(PAGE-1,false)
                        shareViewPager.setCurrentItem(PAGE,false)
                    }}
                return true
            }

        })

언급URL : https://stackoverflow.com/questions/9650265/how-do-disable-paging-by-swiping-with-finger-in-viewpager-but-still-be-able-to-s

반응형