Cómo saber viewpager es desplazarse a la izquierda oa la derecha?
Estoy usando ViewPager (biblioteca de la ayuda). Quiero saber cada vez que el ViewPager cambia la página visible, se desplaza hacia la izquierda o la derecha.
Por favor, dame una solución. Cualquier recomendación es bienvenido también.
- Vista web de Android: evita que los gestos táctiles se pasen a la vista principal de los padres
- Cuenta de puntero incorrectaInterceptTouchEvent
- Android ViewPager w / varias clases de fragmentos cada w / archivo de diseño independiente
- Cómo auto slide android View Pager
- Animación personalizada para viewpager
Gracias
- Depth Pager Transformer igual que SnapChat
- Insertar páginas en el medio de un FragmentPageAdapter
- Cambiar las pestañas que no funcionan al hacer clic en las pestañas con PagerSlidingTabStrips
- Viewpager no se muestra dentro de la fila RecyclerView
- Fragmentos de viewpager anidados en android 2.3.3 y 4.0
- Programaticamente Ocultar Soft Keyboard en ViewPager.OnPageChangeListener onPageSelected ()?
- El ViewPagerIndicator no es fácil con 1000 páginas
- Animación de Cube Flip para Fragments en Android
Establece setOnPageChangeListener
en tu ViewPager
y en
@Override public void onPageSelected(int arg0) { if(lastPage>arg0) {//User Move to left} else(lastPage<arg0) {//User Move to right} lastPage=arg0 }
No es una solución perfecta, pero aquí hay una manera de comprobar la dirección de desplazamiento cuando empiece a deslizar:
new ViewPager.OnPageChangeListener() { private static final float thresholdOffset = 0.5f; private boolean scrollStarted, checkDirection; @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (checkDirection) { if (thresholdOffset > positionOffset) { Log.i(C.TAG, "going left"); } else { Log.i(C.TAG, "going right"); } checkDirection = false; } } @Override public void onPageSelected(int position) {} @Override public void onPageScrollStateChanged(int state) { if (!scrollStarted && state == ViewPager.SCROLL_STATE_DRAGGING) { scrollStarted = true; checkDirection = true; } else { scrollStarted = false; } } });
EDIT: hay un enfoque más elegante que implica usar un ViewPager.PageTransformer
y comprobar sus intervalos de posición:
... myViewPager.setPageTransformer(true, new PageTransformer()); ... public class PageTransformer implements ViewPager.PageTransformer { public void transformPage(View view, float position) { if (position < -1) { // [-00,-1): the page is way off-screen to the left. } else if (position <= 1) { // [-1,1]: the page is "centered" } else { // (1,+00]: the page is way off-screen to the right. } } }
Puede obtener más información de: Uso de ViewPager para diapositivas de pantalla
- Esta es mi solución simple en el método onPageScrolled () de ViewPager.OnPageChangeListener :
La misma solución que GuilhE con una corrección menor para evitar falsos positivos cuando la paginación se queda (pasar a la derecha) en la primera página (no hay más páginas a la izquierda) en ViewPager. Simplemente hace una comprobación adicional para ver si el golpe se ha movido en absoluto.
new ViewPager.OnPageChangeListener() { private static final float thresholdOffset = 0.5f; private static final int thresholdOffsetPixels = 1; private boolean scrollStarted, checkDirection; @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (checkDirection) { if (thresholdOffset > positionOffset && positionOffsetPixels > thresholdOffsetPixels) { Log.i(C.TAG, "going left"); } else { Log.i(C.TAG, "going right"); } checkDirection = false; } } @Override public void onPageSelected(int position) {} @Override public void onPageScrollStateChanged(int state) { if (!scrollStarted && state == ViewPager.SCROLL_STATE_DRAGGING) { scrollStarted = true; checkDirection = true; } else { scrollStarted = false; } } });
Utilice la interfaz ViewPager.OnPageChangeListener
. Puede utilizar el argumento de posición que se pasa a onPageSelected
y compararlo con el valor anterior para averiguar en qué dirección se desplazó el ViewPager
.
Puede mantener la variable miembro de la clase para guardar la última página visitada.
private int mLastVisitedPageIndex = 0;
A continuación, utilice la siguiente función para comprobar la dirección
@Override public void onPageSelected(int i) { boolean isMovingForward = mLastVisitedPageIndex < i?true:false; //Use isMovingForward variable anywhere now mLastVisitedPageIndex = i; }
usa eso
@Override public void onPageSelected( int position ) { mCurrentFragmentPosition = position; } @Override public void onPageScrolled( int position, float positionOffset, int positionOffsetPixels ) { boolean isGoingToRightPage = position == mCurrentFragmentPosition; if(isGoingToRightPage) { // user is going to the right page } else { // user is going to the left page } }
He resuelto el problema con esta implementación. Espero eso ayude.
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 { } }
También podemos hacer esto usando un Viewpager personalizado, que puede contener métodos swipeLeft () y swipeRight () y su método onTouchEvent (evento MotionEvent) puede contener ACTION_MOVE y ACTION_CANCEL.
// Este puede ser el código si es útil.
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(); }
}
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { private int mCurrentSelectedScreen; private int mNextSelectedScreen; private static final float thresholdOffset = 0.5f; private boolean scrollStarted=true, checkDirection=false; ArrayList<Integer> comp_ary=new ArrayList<Integer>(); @Override public void onPageSelected(int arg0) { } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { //Log.e("positionOffsetPixels : "+positionOffsetPixels, "positionOffset : "+positionOffset); comp_ary.add(positionOffsetPixels); if (checkDirection) { if (comp_ary.get(2) < comp_ary.get(comp_ary.size()-1)) { Log.e("going left", "going left"); } else if (comp_ary.get(2) > comp_ary.get(comp_ary.size()-1)) { Log.e("going right", "going right"); } checkDirection = false; comp_ary=new ArrayList<Integer>(); } } @Override public void onPageScrollStateChanged(int arg0) { if (!scrollStarted && arg0 == ViewPager.SCROLL_STATE_SETTLING) { scrollStarted = true; checkDirection = true; } else { scrollStarted = false; } } });
private float sumPositionAndPositionOffset; @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { boolean isSwipeToLeft = position + positionOffset > sumPositionAndPositionOffset; sumPositionAndPositionOffset = position + positionOffset; }
pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if(position == pager.getCurrentItem()){ // Move Right } else{ // Move Left } }
- Android: OnTouch, MotionEvent.ACTION_MOVE no está reconocido?
- Obtener la dirección IP de la puerta de enlace en android