Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to swipe ViewPager images automatically using TimeTask

Tags:

android

Hi I am new in android and in my app I have a lot of images in my ArrayList that 's why I want to swipe those images automatically for every 3 seconds with help of Timetasker and this process is continuously need to repeating up to we close app. Can some body help me please

MainActivity:-

public class MainActivity extends AppCompatActivity {      ViewPager viewPager;      Integer[] imageId = {R.drawable.image1, R.drawable.image2, R.drawable.image3, R.drawable.image4};     String[] imagesName = {"image1","image2","image3","image4"};      @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.main_layout);          viewPager = (ViewPager) findViewById(R.id.viewPager);         PagerAdapter adapter = new CustomAdapter(MainActivity.this,imageId,imagesName);         viewPager.setAdapter(adapter);     } } 

CustomAdapter:-

public class CustomAdapter extends PagerAdapter{      private Activity activity;     private Integer[] imagesArray;     private String[] namesArray;      public CustomAdapter(Activity activity,Integer[] imagesArray,String[] namesArray){          this.activity = activity;         this.imagesArray = imagesArray;         this.namesArray = namesArray;     }      @Override     public Object instantiateItem(ViewGroup container, int position) {          LayoutInflater inflater = ((Activity)activity).getLayoutInflater();          View viewItem = inflater.inflate(R.layout.image_item, container, false);         ImageView imageView = (ImageView) viewItem.findViewById(R.id.imageView);         imageView.setImageResource(imagesArray[position]);         TextView textView1 = (TextView) viewItem.findViewById(R.id.textview);         textView1.setText(namesArray[position]);         ((ViewPager)container).addView(viewItem);          return viewItem;     }      @Override     public int getCount() {         // TODO Auto-generated method stub         return imagesArray.length;     }      @Override     public boolean isViewFromObject(View view, Object object) {         // TODO Auto-generated method stub         return view == ((View)object);     }      @Override     public void destroyItem(ViewGroup container, int position, Object object) {         // TODO Auto-generated method stub         ((ViewPager) container).removeView((View) object);     } } 
like image 581
Krish Avatar asked Jul 20 '16 05:07

Krish


People also ask

How do I scroll in ViewPager?

One should use ViewPager2 and in its XML set android:orientation="vertical" property and your ViewPager will scroll vertically. The complete code will be like this.

What is the use of ViewPager in image slider?

ViewPager is a class in Java that is used in conjunction with Fragments. It is mostly used for designing the UI of the app.

How do I turn off swipe in ViewPager?

To enable / disable the swiping, just overide two methods: onTouchEvent and onInterceptTouchEvent . Both will return "false" if the paging was disabled. You just need to call the setPagingEnabled method with false and users won't be able to swipe to paginate.


2 Answers

Your question is already answered here

Add this in your MainActivity.java

//...    int currentPage = 0; Timer timer; final long DELAY_MS = 500;//delay in milliseconds before task is to be executed final long PERIOD_MS = 3000; // time in milliseconds between successive task executions.   @Override protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.main_layout);      viewPager = (ViewPager) findViewById(R.id.viewPager);     PagerAdapter adapter = new CustomAdapter(MainActivity.this,imageId,imagesName);     viewPager.setAdapter(adapter);      /*After setting the adapter use the timer */     final Handler handler = new Handler();     final Runnable Update = new Runnable() {         public void run() {             if (currentPage == NUM_PAGES-1) {                 currentPage = 0;             }             viewPager.setCurrentItem(currentPage++, true);          }      };      timer = new Timer(); // This will create a new Thread      timer.schedule(new TimerTask() { // task to be scheduled         @Override         public void run() {             handler.post(Update);         }     }, DELAY_MS, PERIOD_MS); } 
like image 172
R.K Avatar answered Sep 23 '22 17:09

R.K


Here is the code for the automatic scroll the viewpager item:

public class MainActivity extends AppCompatActivity {      AutoScrollViewPager viewPager;      Integer[] imageId = {R.drawable.commitementlogo, R.drawable.like, R.drawable.like_select, R.drawable.plus};     String[] imagesName = {"image1","image2","image3","image4"};      @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);          viewPager= (AutoScrollViewPager) findViewById(R.id.viewpager);         viewPager.startAutoScroll();         viewPager.setInterval(3000);         viewPager.setCycle(true);         viewPager.setStopScrollWhenTouch(true);          PagerAdapter adapter = new CustomAdapter(MainActivity.this,imageId,imagesName);         viewPager.setAdapter(adapter);      }   } 

Here AutoscrollViewpager class:

public class AutoScrollViewPager extends ViewPager {      public static final int        DEFAULT_INTERVAL            = 1500;      public static final int        LEFT                        = 0;     public static final int        RIGHT                       = 1;      /** do nothing when sliding at the last or first item **/     public static final int        SLIDE_BORDER_MODE_NONE      = 0;     /** cycle when sliding at the last or first item **/     public static final int        SLIDE_BORDER_MODE_CYCLE     = 1;     /** deliver event to parent when sliding at the last or first item **/     public static final int        SLIDE_BORDER_MODE_TO_PARENT = 2;      /** auto scroll time in milliseconds, default is {@link #DEFAULT_INTERVAL} **/     private long                   interval                    = DEFAULT_INTERVAL;     /** auto scroll direction, default is {@link #RIGHT} **/     private int                    direction                   = RIGHT;     /** whether automatic cycle when auto scroll reaching the last or first item, default is true **/     private boolean                isCycle                     = true;     /** whether stop auto scroll when touching, default is true **/     private boolean                stopScrollWhenTouch         = true;     /** how to process when sliding at the last or first item, default is {@link #SLIDE_BORDER_MODE_NONE} **/     private int                    slideBorderMode             = SLIDE_BORDER_MODE_NONE;     /** whether animating when auto scroll at the last or first item **/     private boolean                isBorderAnimation           = true;     /** scroll factor for auto scroll animation, default is 1.0 **/     private double                 autoScrollFactor            = 1.0;     /** scroll factor for swipe scroll animation, default is 1.0 **/     private double                 swipeScrollFactor           = 1.0;      private Handler handler;     private boolean                isAutoScroll                = false;     private boolean                isStopByTouch               = false;     private float                  touchX                      = 0f, downX = 0f;     private CustomDurationScroller scroller                    = null;      public static final int        SCROLL_WHAT                 = 0;      public AutoScrollViewPager(Context paramContext) {         super(paramContext);         init();     }      public AutoScrollViewPager(Context paramContext, AttributeSet paramAttributeSet) {         super(paramContext, paramAttributeSet);         init();     }      private void init() {         handler = new MyHandler(this);         setViewPagerScroller();     }      /**      * start auto scroll, first scroll delay time is {@link #getInterval()}      */     public void startAutoScroll() {         isAutoScroll = true;         sendScrollMessage((long)(interval + scroller.getDuration() / autoScrollFactor * swipeScrollFactor));     }      /**      * start auto scroll      *       * @param delayTimeInMills first scroll delay time      */     public void startAutoScroll(int delayTimeInMills) {         isAutoScroll = true;         sendScrollMessage(delayTimeInMills);     }      /**      * stop auto scroll      */     public void stopAutoScroll() {         isAutoScroll = false;         handler.removeMessages(SCROLL_WHAT);     }      /**      * set the factor by which the duration of sliding animation will change while swiping      */     public void setSwipeScrollDurationFactor(double scrollFactor) {         swipeScrollFactor = scrollFactor;     }      /**      * set the factor by which the duration of sliding animation will change while auto scrolling      */     public void setAutoScrollDurationFactor(double scrollFactor) {         autoScrollFactor = scrollFactor;     }      private void sendScrollMessage(long delayTimeInMills) {         /** remove messages before, keeps one message is running at most **/         handler.removeMessages(SCROLL_WHAT);         handler.sendEmptyMessageDelayed(SCROLL_WHAT, delayTimeInMills);     }      /**      * set ViewPager scroller to change animation duration when sliding      */     private void setViewPagerScroller() {         try {             Field scrollerField = ViewPager.class.getDeclaredField("mScroller");             scrollerField.setAccessible(true);             Field interpolatorField = ViewPager.class.getDeclaredField("sInterpolator");             interpolatorField.setAccessible(true);              scroller = new CustomDurationScroller(getContext(), (Interpolator)interpolatorField.get(null));             scrollerField.set(this, scroller);         } catch (Exception e) {             e.printStackTrace();         }     }      /**      * scroll only once      */     public void scrollOnce() {         PagerAdapter adapter = getAdapter();         int currentItem = getCurrentItem();         int totalCount;         if (adapter == null || (totalCount = adapter.getCount()) <= 1) {             return;         }          int nextItem = (direction == LEFT) ? --currentItem : ++currentItem;         if (nextItem < 0) {             if (isCycle) {                 setCurrentItem(totalCount - 1, isBorderAnimation);             }         } else if (nextItem == totalCount) {             if (isCycle) {                 setCurrentItem(0, isBorderAnimation);             }         } else {             setCurrentItem(nextItem, true);         }     }      /**      * <ul>      * if stopScrollWhenTouch is true      * <li>if event is down, stop auto scroll.</li>      * <li>if event is up, start auto scroll again.</li>      * </ul>      */     @Override     public boolean dispatchTouchEvent(MotionEvent ev) {         int action = ev.getActionMasked();          if (stopScrollWhenTouch) {             if ((action == MotionEvent.ACTION_DOWN) && isAutoScroll) {                 isStopByTouch = true;                 stopAutoScroll();             } else if (ev.getAction() == MotionEvent.ACTION_UP && isStopByTouch) {                 startAutoScroll();             }         }          if (slideBorderMode == SLIDE_BORDER_MODE_TO_PARENT || slideBorderMode == SLIDE_BORDER_MODE_CYCLE) {             touchX = ev.getX();             if (ev.getAction() == MotionEvent.ACTION_DOWN) {                 downX = touchX;             }             int currentItem = getCurrentItem();             PagerAdapter adapter = getAdapter();             int pageCount = adapter == null ? 0 : adapter.getCount();             /**              * current index is first one and slide to right or current index is last one and slide to left.<br/>              * if slide border mode is to parent, then requestDisallowInterceptTouchEvent false.<br/>              * else scroll to last one when current item is first one, scroll to first one when current item is last              * one.              */             if ((currentItem == 0 && downX <= touchX) || (currentItem == pageCount - 1 && downX >= touchX)) {                 if (slideBorderMode == SLIDE_BORDER_MODE_TO_PARENT) {                     getParent().requestDisallowInterceptTouchEvent(false);                 } else {                     if (pageCount > 1) {                         setCurrentItem(pageCount - currentItem - 1, isBorderAnimation);                     }                     getParent().requestDisallowInterceptTouchEvent(true);                 }                 return super.dispatchTouchEvent(ev);             }         }         getParent().requestDisallowInterceptTouchEvent(true);          return super.dispatchTouchEvent(ev);     }      private static class MyHandler extends Handler {          private final WeakReference<AutoScrollViewPager> autoScrollViewPager;          public MyHandler(AutoScrollViewPager autoScrollViewPager) {             this.autoScrollViewPager = new WeakReference<AutoScrollViewPager>(autoScrollViewPager);         }          @Override         public void handleMessage(Message msg) {             super.handleMessage(msg);              switch (msg.what) {                 case SCROLL_WHAT:                     AutoScrollViewPager pager = this.autoScrollViewPager.get();                     if (pager != null) {                         pager.scroller.setScrollDurationFactor(pager.autoScrollFactor);                         pager.scrollOnce();                         pager.scroller.setScrollDurationFactor(pager.swipeScrollFactor);                         pager.sendScrollMessage(pager.interval + pager.scroller.getDuration());                     }                 default:                     break;             }         }     }      /**      * get auto scroll time in milliseconds, default is {@link #DEFAULT_INTERVAL}      *       * @return the interval      */     public long getInterval() {         return interval;     }      /**      * set auto scroll time in milliseconds, default is {@link #DEFAULT_INTERVAL}      *       * @param interval the interval to set      */     public void setInterval(long interval) {         this.interval = interval;     }      /**      * get auto scroll direction      *       * @return {@link #LEFT} or {@link #RIGHT}, default is {@link #RIGHT}      */     public int getDirection() {         return (direction == LEFT) ? LEFT : RIGHT;     }      /**      * set auto scroll direction      *       * @param direction {@link #LEFT} or {@link #RIGHT}, default is {@link #RIGHT}      */     public void setDirection(int direction) {         this.direction = direction;     }      /**      * whether automatic cycle when auto scroll reaching the last or first item, default is true      *       * @return the isCycle      */     public boolean isCycle() {         return isCycle;     }      /**      * set whether automatic cycle when auto scroll reaching the last or first item, default is true      *       * @param isCycle the isCycle to set      */     public void setCycle(boolean isCycle) {         this.isCycle = isCycle;     }      /**      * whether stop auto scroll when touching, default is true      *       * @return the stopScrollWhenTouch      */     public boolean isStopScrollWhenTouch() {         return stopScrollWhenTouch;     }      /**      * set whether stop auto scroll when touching, default is true      *       * @param stopScrollWhenTouch      */     public void setStopScrollWhenTouch(boolean stopScrollWhenTouch) {         this.stopScrollWhenTouch = stopScrollWhenTouch;     }      /**      * get how to process when sliding at the last or first item      *       * @return the slideBorderMode {@link #SLIDE_BORDER_MODE_NONE}, {@link #SLIDE_BORDER_MODE_TO_PARENT},      *         {@link #SLIDE_BORDER_MODE_CYCLE}, default is {@link #SLIDE_BORDER_MODE_NONE}      */     public int getSlideBorderMode() {         return slideBorderMode;     }      /**      * set how to process when sliding at the last or first item      *       * @param slideBorderMode {@link #SLIDE_BORDER_MODE_NONE}, {@link #SLIDE_BORDER_MODE_TO_PARENT},      *        {@link #SLIDE_BORDER_MODE_CYCLE}, default is {@link #SLIDE_BORDER_MODE_NONE}      */     public void setSlideBorderMode(int slideBorderMode) {         this.slideBorderMode = slideBorderMode;     }      /**      * whether animating when auto scroll at the last or first item, default is true      *       * @return      */     public boolean isBorderAnimation() {         return isBorderAnimation;     }      /**      * set whether animating when auto scroll at the last or first item, default is true      *       * @param isBorderAnimation      */     public void setBorderAnimation(boolean isBorderAnimation) {         this.isBorderAnimation = isBorderAnimation;     } } 

here CustomDurationScroller class:

public class CustomDurationScroller extends Scroller {      private double scrollFactor = 1;      public CustomDurationScroller(Context context) {         super(context);     }      public CustomDurationScroller(Context context, Interpolator interpolator) {         super(context, interpolator);     }      public void setScrollDurationFactor(double scrollFactor) {         this.scrollFactor = scrollFactor;     }      @Override     public void startScroll(int startX, int startY, int dx, int dy, int duration) {         super.startScroll(startX, startY, dx, dy, (int)(duration * scrollFactor));     } } 

and set the adapter same as you previously set.

like image 23
sneha desai Avatar answered Sep 23 '22 17:09

sneha desai