Android implementation of custom Carousel picture control detailed _android

Source: Internet
Author: User
Tags int size object object static class

First, the effect chart

Implementation principle

To complete a carousel picture, the first thought should be ViewPager to use to achieve. ViewPagerThere's already a sliding function, we just let it roll itself. Plus the small dots below. So our custom controls are made up ViewPager LinearLayout of and stacked together.

First, create a custom Viewpager

First, complete code.

Package Com.kcode.autoscrollviewpager.view;
Import Android.content.Context;
Import Android.os.Message;
Import Android.support.v4.view.ViewPager;
Import Android.util.AttributeSet;
Import Android.util.Log;

Import android.view.MotionEvent;
Import Java.util.Timer;

Import Java.util.TimerTask;
 /** * Created by Caik on 2016/10/10.

 * * public class Autoviewpager extends Viewpager {private static final String TAG = "Autoviewpager";

 private int CurrentItem;
 Private Timer Mtimer;

 Private Autotask Mtask;

 Private Boolean Isfirst = true;
 Public Autoviewpager {Super (context);
 Public Autoviewpager (context, AttributeSet attrs) {Super (context, attrs);
  public void Start () {if (Mtimer = = null) {Mtimer = new Timer ();

 } mtimer.schedule (New Autotask (), 3000,3000);
   Private Runnable Runnable = new Runnable () {@Override public void run () {CurrentItem = Getcurrentitem (); if (CurrentItem = = Getadapter (). GetCount ()-1) {CurrEntitem = 0;
   }else {currentitem++;
  } setcurrentitem (CurrentItem);

 }
 };

 Private Autohandler Mhandler = new Autohandler (); public void Updatepointview (int size) {if (GetParent () instanceof Autoscrollviewpager) {Autoscrollviewpager pager =
   (Autoscrollviewpager) GetParent ();
  Pager.initpointview (size);
  }else {log.e (TAG, "Parent view not being Autoscrollviewpager");
  } public void onpageselected (int position) {Autoscrollviewpager pager = (Autoscrollviewpager) getparent ();
 Pager.updatepointview (position);
  Private class Autotask extends timertask{@Override public void Run () {mhandler.post (runnable); } private final static class Autohandler extends android.os.handler{@Override public void Handlemessage

  msg) {super.handlemessage (msg);
   } public void OnStop () {///First cancels the timer if (Mtimer!= null) {mtimer.cancel ();
  Mtimer = null;
 } public void OnDestroy () {onStop ();
 public void Onresume () { Start ();
    @Override public boolean ontouchevent (motionevent ev) {switch (ev.getaction ()) {case Motionevent.action_down:
    LOG.I (TAG, "down");
    OnStop ();
   Break
    Case MOTIONEVENT.ACTION_MOVE:LOG.I (TAG, "move");
   Break
    Case MOTIONEVENT.ACTION_UP:LOG.I (TAG, "up");
    Onresume ();
  Break
 return super.ontouchevent (EV); }
}

Autoviewpager inherits to Viewpager, we start a timer with a timer.

public void Start () {
  if (Mtimer = = null) {
   Mtimer = new Timer ();
  }
  Mtimer.schedule (New Autotask (), 3000,3000);

 }

 Private Runnable Runnable = new Runnable () {
  @Override public
  void Run () {
   CurrentItem = Getcurrentitem (); 
   if (CurrentItem = = Getadapter (). GetCount ()-1) {
    CurrentItem = 0;
   } else {
    currentitem++;
   }
   Setcurrentitem (CurrentItem);
  }
 ;

Update the page every three seconds. This will make a rolling effect of their own.

Second, set up adapter

To achieve an infinite loop, just return the method in the adapter to getCount() Infinity and return directly Integer.MAX_VALUE .

Complete Adapter Code:

Package Com.kcode.autoscrollviewpager.view;
Import Android.content.Context;
Import Android.support.v4.view.PagerAdapter;
Import Android.support.v4.view.ViewPager;
Import Android.view.LayoutInflater;
Import Android.view.View;
Import Android.view.ViewGroup;

Import Android.widget.ImageView;

Import COM.KCODE.AUTOSCROLLVIEWPAGER.R;
Import java.util.ArrayList;

Import java.util.List;
 /** * Created by Caik on 2016/10/11.

 * Public abstract class Baseviewpageradapter<t> extends Pageradapter implements viewpager.onpagechangelistener{

 Private list<t> data = new arraylist<> ();
 Private context Mcontext;

 Private Autoviewpager Mview;

 Private Onautoviewpageritemclicklistener listener;
 Public Baseviewpageradapter (List<t> t) {this.data = t;
  Public Baseviewpageradapter, Autoviewpager viewpager {this.mcontext = context;
  Mview = Viewpager;
  Mview.setadapter (this);
  Mview.addonpagechangelistener (this);
 Mview.setcurrentitem (0);


 }Public Baseviewpageradapter (context context, Autoviewpager Viewpager,onautoviewpageritemclicklistener listener) {
  This.mcontext = context;
  Mview = Viewpager;
  This.listener = listener;
  Mview.setadapter (this);
  Mview.addonpagechangelistener (this);
 Mview.setcurrentitem (0); Public Baseviewpageradapter, list<t> Data,autoviewpager Viewpager,
  Onautoviewpageritemclicklistener listener) {This.mcontext = context;
  Mview = Viewpager;
  This.data = data;
  This.listener = listener;
  Mview.setadapter (this);
  Mview.addonpagechangelistener (this);

  Mview.setcurrentitem (0);
  Mview.start ();
 Mview.updatepointview (Getrealcount ());
  public void Add (t) {Data.add (t);
  Notifydatasetchanged ();
 Mview.updatepointview (Getrealcount ());
 @Override public int GetCount () {return data = null 0:integer.max_value;
 public int Getrealcount () {return data = null? 0:data.size (); @Override public void Destroyitem (ViewGroup container, int Position, object) {Container.removeview ((ImageView) object); @Override public Object Instantiateitem (ViewGroup container, final int position) {ImageView view = (ImageView) Lay
  Outinflater.from (Mcontext). Inflate (R.layout.imageview,container,false); View.setonclicklistener (New View.onclicklistener () {@Override public void OnClick (view view) {if listener!=
    NULL) {Listener.onitemclick (position% getrealcount (), data.get (position% Getrealcount ()));

  }
   }
  });
  LoadImage (View,position, data.get (position% Getrealcount ()));

  Container.addview (view);
 return view;

 public abstract void LoadImage (ImageView view,int position,t T);
 @Override public boolean isviewfromobject (view view, Object object) {return view = = object;
 @Override public void onpagescrolled (int position, float positionoffset, int positionoffsetpixels) {} @Override public void onpageselected (int position) {mview.onpageselected (position% GetrealcounT ()); @Override public void onpagescrollstatechanged (int state) {} public interface ONAUTOVIEWPAGERITEMCLICKLISTENER&L T
 t> {void Onitemclick (int position,t T); }
}

Here we use generics, because sometimes we can just pass a URL to the collection, or it may be a collection of objects to facilitate expansion. The method of loading a picture is also an abstract method

public abstract void LoadImage (ImageView view,int position,t T);

Because each app uses a different picture-loading frame, the load here is implemented by the app itself. Use to create adapter as long as you inherit here BaseViewPagerAdapter , and then rewrite the loadImage(ImageView view,int position,T t) method, where the picture is loaded on the line.

If you need a small dot at the bottom, it's done here.

When used, direct use

 <com.kcode.autoscrollviewpager.view.autoviewpager
  android:layout_width= "Match_parent"
  android: layout_height= "200DP" >
  
 </com.kcode.autoscrollviewpager.view.AutoViewPager>

Replace

 <android.support.v4.view.viewpager
  android:layout_width= "match_parent"
  android:layout_height= " Match_parent ">

 </android.support.v4.view.ViewPager>

It's OK. Need a small dot at the bottom to mark the words, continue down

Third, add small dot mark

You need to add a dot marker. In fact, it is to add another layer on the Viewpager. We create a new view that inherits to Relativelayout

The complete code is as follows:

Package Com.kcode.autoscrollviewpager.view;
Import Android.content.Context;
Import Android.util.AttributeSet;
Import Android.view.ViewGroup;
Import Android.widget.ImageView;
Import Android.widget.LinearLayout;

Import Android.widget.RelativeLayout;

Import COM.KCODE.AUTOSCROLLVIEWPAGER.R;

Import static Android.view.Gravity.CENTER;
 /** * Created by Caik on 2016/10/17.

 * * public class Autoscrollviewpager extends relativelayout{private Autoviewpager Mviewpager;

 Private context Mcontext;

 Private LinearLayout layout;
  Public Autoscrollviewpager {Super (context);
 Init (context);
  Public Autoscrollviewpager (context, AttributeSet attrs) {Super (context, attrs);
 Init (context);
  private void init (context context) {Mcontext = context;
  Mviewpager = new Autoviewpager (context);
  Layout = new LinearLayout (mcontext);
 AddView (Mviewpager);
 Public Autoviewpager Getviewpager () {return mviewpager; public void Initpointview (int size) {

  Layout = new LinearLayout (mcontext);
   for (int i = 0; i < size; i++) {ImageView ImageView = new ImageView (mcontext);
   Linearlayout.layoutparams params = new Linearlayout.layoutparams (20,20);
   Params.leftmargin = 8;
   params.gravity = CENTER;
   Imageview.setlayoutparams (params);
   if (i = = 0) {imageview.setbackgroundresource (r.drawable.point_checked);
   }else {imageview.setbackgroundresource (r.drawable.point_normal);
  } layout.addview (ImageView); } layoutparams layoutparams = new Layoutparams (ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_
  CONTENT);
  Layoutparams.addrule (Align_parent_bottom);
  Layoutparams.addrule (Align_parent_right);
  Layoutparams.setmargins (12,20,12,20);
  Layout.setlayoutparams (Layoutparams);
 AddView (layout);
  public void Updatepointview (int position) {int size = Layout.getchildcount ();
   for (int i = 0; i < size; i++) {ImageView ImageView = (imageview) layout.getchildat (i); if (i = = Position) {imageview.setbackgroundresource (r.drawable.point_checked);
   }else {imageview.setbackgroundresource (r.drawable.point_normal); }

  }
 }

}

When initializing, create one ViewPager , one LinearLayout (to place dots)

 Public Autoscrollviewpager {
  super (context);
  Init (context);
 }

 Public Autoscrollviewpager (context, AttributeSet attrs) {
  Super (context, attrs);
  Init (context);
 }

 private void init (context context) {
  Mcontext = context;
  Mviewpager = new Autoviewpager (context);
  Layout = new LinearLayout (mcontext);
  AddView (Mviewpager);
 }

Again by addView(mViewPager); adding.

Two pictures need to be prepared, drawn with shape, and shape can be used to view the Android shape.

Initialize Small dots:

 public void Initpointview (int size) {

  layout = new LinearLayout (mcontext);
  for (int i = 0; i < size; i++) {
   ImageView ImageView = new ImageView (mcontext);
   Linearlayout.layoutparams params = new Linearlayout.layoutparams (20,20);
   Params.leftmargin = 8;
   params.gravity = CENTER;
   Imageview.setlayoutparams (params);
   if (i = = 0) {
    imageview.setbackgroundresource (r.drawable.point_checked);
   } else {
    imageview.setbackgroundresource (r.drawable.point_normal);
   }

   Layout.addview (ImageView);
  }

  Layoutparams layoutparams = new Layoutparams (ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_ CONTENT);
  Layoutparams.addrule (align_parent_bottom);
  Layoutparams.addrule (align_parent_right);
  Layoutparams.setmargins (12,20,12,20);
  Layout.setlayoutparams (layoutparams);
  AddView (layout);
 }

To update small dots:

 public void Updatepointview (int position) {
  int size = Layout.getchildcount ();
  for (int i = 0; i < size; i++) {
   ImageView ImageView = (imageview) layout.getchildat (i);
   if (i = = position) {
    imageview.setbackgroundresource (r.drawable.point_checked);
   } else {
    imageview.setbackgroundresource (r.drawable.point_normal);}}}
 

Use the following controls with Dots

 <com.kcode.autoscrollviewpager.view.autoscrollviewpager
  android:id= "@+id/viewpager"
  android: Layout_width= "Match_parent"
  android:layout_height= "220DP" >

 </ Com.kcode.autoscrollviewpager.view.autoscrollviewpager>

Summarize

The above is the entire content of this article, I hope the content of this article for everyone's study or work can bring certain help, if you have questions you can message exchange.

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.