Intereting Posts
Поскольку для Android 6.0, прослушивающего изменения PhoneStateListener.LISTEN_DATA_CONNECTION_STATE, больше не требуется разрешение READ_PHONE_STATE Разница между close () и отключением () в Android Bluetooth API? Как проверить, зарегистрирован ли пользователь в Google+? Исправлено, где / когда описываетсяContents () используется? Проблема с XML xml-рендерингом в eclipse? Ошибка памяти: куча памяти Java на Android Studio Прокрутка списка Chrome Browser для Android больше не поддерживает -webkit-overflow-прокрутку? Есть ли альтернатива? Как получить доступ к `this` внутри renderRow ListView? Как определить, является ли путь локальным файлом или нет? Загружать большие изображения в растровые изображения? Как включить только один экземпляр моего приложения Как получить установленные разрешения приложений Разница между внутренней картой SD и внутренним хранилищем. Как обрабатывать ошибки в пользовательском AsyncTaskLoader?

Прокручивание направления в ViewPager

У меня есть приложение для Android, которое использует ViewPager и FragmentStatePagerAdapter. Однако мне нужно добавить новую функцию, в которой я должен знать направление движения, чтобы перейти от одного фрагмента к другому, влево или вправо. (Т. Е. Когда я сажусь влево, я бы сделал одно, а когда я провёл вправо, я сделал бы что-то еще).

Обратите внимание: мне не нужны события, которые произойдут после того, как салфетка закончится. Я должен делать эти события, когда происходит салфетка. Я думал об использовании setOnPageChangeListener() но это не говорит мне направление прокрутки. Можете ли вы мне посоветовать, как определить направление движения?

Благодарю.

Solutions Collecting From Web of "Прокручивание направления в ViewPager"

Взгляните на метод onPageSelected(int position) для ViewPager.OnPageChangeListener . position дает индекс новой выбранной страницы. Если вы держите дорожку текущего индекса страницы, вы можете сравнить его с индексом position чтобы получить левое / правое направление салфетки.

Теперь, когда вы упоминаете OnPageChangeListener, это не помогает, рассмотрите метод onInterceptTouchEvent (MotionEvent ev) ViewPager . Учитывайте ACTION_DOWN, ACTION_MOVE и ACTION_UP MotionEvent. Надеюсь это поможет.

Возможно, вы можете создать слушателя следующим образом:

 buttonIcons.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(final View v, final MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: downX = event.getX(); return true; case MotionEvent.ACTION_UP: upX = event.getX(); final float deltaX = downX - upX; if (deltaX > 0 && deltaX > SWIPE_MIN_DISTANCE) { final Animation loadInAnimation = AnimationUtils .loadAnimation( activity.this, R.anim.slide_in_right); final Animation loadOutAnimation = AnimationUtils .loadAnimation( activity.this, R.anim.slide_out_left); viewFlipper.setInAnimation(loadInAnimation); viewFlipper.setOutAnimation(loadOutAnimation); viewFlipper.showPrevious(); startSaveButtonAnimation(); } if (deltaX < 0 && -deltaX > SWIPE_MIN_DISTANCE) { final Animation loadInAnimation = AnimationUtils .loadAnimation( activity.this, R.anim.slide_in_left); final Animation loadOutAnimation = AnimationUtils .loadAnimation( activity.this, R.anim.slide_out_right); viewFlipper.setInAnimation(loadInAnimation); viewFlipper.setOutAnimation(loadOutAnimation); viewFlipper.showNext(); startSaveButtonAnimation(); } return true; } return false; } }); 

Я столкнулся с этой проблемой и должен знать направление движения, как это происходило , чтобы предотвратить прокрутку в определенном направлении. Вот как я решил свою проблему, надеюсь, это полезно кому-то. Я нашел все предыдущие примеры неэффективными для того, что мне было нужно.

Если вы подклассифицируете ViewPager, вы можете отвечать на onInterceptTouchEvent(MotionEvent event) и onTouchEvent(MotionEvent event) для ViewPager

 @Override public boolean onInterceptTouchEvent(MotionEvent event) { boolean wasSwipeToRight = this.wasSwipeToRightEvent(event)); // Do what you want here with left/right swipe return super.onInterceptTouchEvent(event); } @Override public boolean onTouchEvent(MotionEvent event) { boolean wasSwipeToRight = this.wasSwipeToRightEvent(event)); // Do what you want here with left/right swipe return super.onTouchEvent(event); } 

Вот метод, который вызывается для определения направления события.

 // Stores the starting X position of the ACTION_DOWN event float downX; /** * Checks the X position value of the event and compares it to * previous MotionEvents. Returns a true/false value based on if the * event was an swipe to the right or a swipe to the left. * * @param event - Motion Event triggered by the ViewPager * @return - True if the swipe was from left to right. False otherwise */ private boolean wasSwipeToRightEvent(MotionEvent event){ switch (event.getAction()) { case MotionEvent.ACTION_DOWN: downX = event.getX(); return false; case MotionEvent.ACTION_MOVE: case MotionEvent.ACTION_UP: return downX - event.getX() > 0; default: return false; } } 

Фактически вы можете найти направление от использования параметров onPageScrolled .
Следующий слушатель установлен для отображения сообщения журнала один раз на направление изменения чистого фрагмента (слева, если левые фрагменты отображаются, в центре, если фрагмент не отображается, справа, если показывает правый фрагмент).
Переменные класса, необходимо отслеживать

  // -1 - left, 0 - center, 1 - right private int scroll = 0; // set only on `onPageSelected` use it in `onPageScrolled` // if currentPage < page - we swipe from left to right // if currentPage == page - we swipe from right to left or centered private int currentPage = 0; // if currentPage < page offset goes from `screen width` to `0` // as you reveal right fragment. // if currentPage == page , offset goes from `0` to `screen width` // as you reveal right fragment // You can use it to see //if user continue to reveal next fragment or moves it back private int currentOffset = 0; // behaves similar to offset in range `[0..1)` private float currentScale = 0; 

Слушатель

 pager.addOnPageChangeListener( new OnPageChangeListener(){ @Override public void onPageScrolled(int page, float scale, int offset){ if(scale != 0f && offset > 10){ if(currentOffset > offset && currentScale > scale && (page + 1) == currentPage){ if(scroll != -1){ newImageSet = true; scroll = -1; Log.e("scroll", "left"); } } else if(currentOffset < offset && currentScale < scale && page == currentPage){ if(scroll != 1){ newImageSet = true; scroll = 1; Log.e("scroll", "right"); } } currentOffset = offset; currentScale = scale; } @Override public void onPageSelected(int i){ Log.e("scroll","centre"); // we are centerd, reset class variables currentPage = i; currentScale = 0; currentOffset = 0; scroll = 0; } @Override public void onPageScrollStateChanged(int i){ } } ); 

Это достаточно просто с введением переменной экземпляра, чтобы отслеживать текущую страницу.

 public class MyActivity extends Activity implements ViewPager.OnPageChangeListener { private ViewPager viewPager; private int currentPosition; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Do trivial stuff . . . viewPager.setOnClickListener(this); // doesnt have to be in onCreate } @Override public void onPageSelected(int position) { if(currentPosition < position) { // handle swipe LEFT } else if(currentPosition > position){ // handle swipe RIGHT } currentPosition = position; // Update current position } } 

Вы можете добавить OnPageChangeListner в ViewPager и сделать что-то вроде этого:

 mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { float tempPositionOffset = 0; @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (position == 0) { if (tempPositionOffset < positionOffset) { Log.d("eric", "scrolling left ..."); } else { Log.d("eric", "scrolling right ..."); } tempPositionOffset = positionOffset; Log.d("eric", "position " + position + "; " + " positionOffset " + positionOffset + "; " + " positionOffsetPixels " + positionOffsetPixels + ";"); } } @Override public void onPageSelected(int position) { } @Override public void onPageScrollStateChanged(int state) { } }); 

Вы можете использовать setOnPageChangeListener() и правильно реализовать onPageScrolled(int position, float positionOffset, int positionOffsetPixels) .

Вы можете определить направление с помощью positionOffset и переменной положения:

 public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if(position == mCurrentPosition && positionOffset > 0) { //swipe right } else if (positionOffset > 0) { //swipe left } }