Android ViewPager avec des points bas

Je veux append 3 points bas à mon ViewPager, comme ceci.

3 points bas3 points bas3 points bas

J’utilise FragmentActivity et supporte la bibliothèque ViewPager.

    Pas besoin de beaucoup de code. Vous pouvez faire tout cela sans coder autant en utilisant uniquement viewpager avec tablayout . Voici la procédure:
    Votre mise en page principale:

          

    Connectez vos éléments d’interface utilisateur en activité ou fragmentez comme suit:
    Code Java:

     mImageViewPager = (ViewPager) findViewById(R.id.pager); TabLayout tabLayout = (TabLayout) findViewById(R.id.tabDots); tabLayout.setupWithViewPager(mImageViewPager, true); 

    Ça y est, vous êtes prêt à partir.

    Le fichier de ressources xml suivant doit être créé dans un dossier pouvant être dessiné .
    tab_indicator_selected.xml

          

    tab_indicator_default.xml

              

    tab_selector.xml

           

    Se sentir aussi paresseux que moi? Eh bien, tout le code ci-dessus est converti en bibliothèque!

    Usage

    Ajoutez ce qui suit dans votre gradle:

     comstack 'com.chabbal:slidingdotsplash:1.0.2' 

    Ajoutez la suite à votre disposition d’activité ou de fragment.

      

    Créez un tableau d’entiers dans ssortingngs.xml par exemple

      @drawable/img1 @drawable/img2 @drawable/img3 @drawable/img4  

    Terminé!



    Extra pour écouter les changements de page
    addOnPageChangeListener (écouteur);

    Lien Github.

     viewPager.addOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int position) { switch (position) { case 0: img_page1.setImageResource(R.drawable.dot_selected); img_page2.setImageResource(R.drawable.dot); img_page3.setImageResource(R.drawable.dot); img_page4.setImageResource(R.drawable.dot); break; case 1: img_page1.setImageResource(R.drawable.dot); img_page2.setImageResource(R.drawable.dot_selected); img_page3.setImageResource(R.drawable.dot); img_page4.setImageResource(R.drawable.dot); break; case 2: img_page1.setImageResource(R.drawable.dot); img_page2.setImageResource(R.drawable.dot); img_page3.setImageResource(R.drawable.dot_selected); img_page4.setImageResource(R.drawable.dot); break; case 3: img_page1.setImageResource(R.drawable.dot); img_page2.setImageResource(R.drawable.dot); img_page3.setImageResource(R.drawable.dot); img_page4.setImageResource(R.drawable.dot_selected); break; default: break; } } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { } }); 

    Ma solution à la main:

    Dans la mise en page:

      

    Et dans l’activité

     private final static int NUM_PAGES = 5; private ViewPager mViewPager; private List dots; @Override protected void onCreate(Bundle savedInstanceState) { // ... addDots(); } public void addDots() { dots = new ArrayList<>(); LinearLayout dotsLayout = (LinearLayout)findViewById(R.id.dots); for(int i = 0; i < NUM_PAGES; i++) { ImageView dot = new ImageView(this); dot.setImageDrawable(getResources().getDrawable(R.drawable.pager_dot_not_selected)); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT ); dotsLayout.addView(dot, params); dots.add(dot); } mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { selectDot(position); } @Override public void onPageScrollStateChanged(int state) { } }); } public void selectDot(int idx) { Resources res = getResources(); for(int i = 0; i < NUM_PAGES; i++) { int drawableId = (i==idx)?(R.drawable.pager_dot_selected):(R.drawable.pager_dot_not_selected); Drawable drawable = res.getDrawable(drawableId); dots.get(i).setImageDrawable(drawable); } } 

    J’ai créé une bibliothèque pour répondre au besoin d’un indicateur de page dans un ViewPager. Ma bibliothèque contient une vue appelée DotIndicator. Pour utiliser ma bibliothèque, ajoutez comstack 'com.matthew-tamlin:sliding-intro-screen:3.2.0' à votre fichier de compilation gradle.

    La vue peut être ajoutée à votre mise en page en ajoutant les éléments suivants:

       

    Le code ci-dessus reproduit parfaitement les fonctionnalités des points sur l’écran d’accueil de Google Launcher. Toutefois, si vous souhaitez le personnaliser davantage, vous pouvez append les atsortingbuts suivants:

    • app:unselectedDotDiameter et app:selectedDotDiameter pour définir les diamètres des points
    • app:unselectedDotColor et app:selectedDotColor pour définir les couleurs des points
    • app:spacingBetweenDots pour changer la distance entre les points
    • app:dotTransitionDuration pour définir l’heure de l’animation du changement de petite à grande (et retour)

    De plus, la vue peut être créée par programme en utilisant:

     DotIndicator indicator = new DotIndicator(context); 

    Des méthodes existent pour modifier les propriétés, similaires aux atsortingbuts. Pour mettre à jour l’indicateur afin d’afficher une page différente de celle sélectionnée, il vous suffit d’appeler la méthode indicator.setSelectedItem(int, true) depuis ViewPager.OnPageChangeListener.onPageSelected(int) .

    Voici un exemple d’utilisation:

    entrer la description de l'image ici

    Si cela vous intéresse, la bibliothèque a été conçue pour créer des écrans d’introduction tels que celui présenté ci-dessus.

    Source Github disponible ici: https://github.com/MatthewTamlin/SlidingIntroScreen

    ViewPagerIndicator n’a pas été mis à jour depuis 2012 et a reçu plusieurs bogues qui n’ont jamais été corrigés.

    J’ai enfin trouvé une alternative avec cette photothèque qui affiche de jolis points pour le viewpager , voici le lien:

    https://github.com/ongakuer/CircleIndicator

    Facile à mettre en œuvre!

    Vous pouvez essayer la bibliothèque de Jake Wharton – https://github.com/JakeWharton/Android-ViewPagerIndicator

    J’ai pensé à poster une solution plus simple pour le problème ci-dessus et les numéros des indicateurs peuvent être modifiés dynamicment en changeant seulement une valeur de variable dotCounts=x ce que j’ai fait comme ça.

    1) Créez un fichier xml dans le dossier pouvant être dessiné pour l’indicateur de page sélectionné nommé “item_selected”.

          

    2) Créez un fichier xml supplémentaire pour l’indicateur non sélectionné nommé “item_unselected”

          

    3) Maintenant, ajoutez cette partie du code à l’endroit où vous souhaitez afficher les indicateurs de vue ci-dessous dans viewPager dans votre fichier XML Layout.

         

    4) Ajoutez cette fonction au-dessus de votre fichier de fichier d’activité où votre mise en page est gonflée ou le fichier xml ci-dessus est lié à

     private int dotsCount=5; //No of tabs or images private ImageView[] dots; LinearLayout linearLayout; private void drawPageSelectionIndicators(int mPosition){ if(linearLayout!=null) { linearLayout.removeAllViews(); } linearLayout=(LinearLayout)findViewById(R.id.viewPagerCountDots); dots = new ImageView[dotsCount]; for (int i = 0; i < dotsCount; i++) { dots[i] = new ImageView(context); if(i==mPosition) dots[i].setImageDrawable(getResources().getDrawable(R.drawable.item_selected)); else dots[i].setImageDrawable(getResources().getDrawable(R.drawable.item_unselected)); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT ); params.setMargins(4, 0, 4, 0); linearLayout.addView(dots[i], params); } } 

    5) Enfin, dans votre méthode onCreate, ajoutez le code suivant pour référencer votre mise en page et gérer les positions de pages sélectionnées.

     drawPageSelectionIndicators(0); mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { drawPageSelectionIndicators(position); } @Override public void onPageScrollStateChanged(int state) { } }); 

    Voici ma solution proposée.

    • Étant donné que nous devons montrer uniquement certaines images dans la vue, les téléavertisseurs ont donc évité l’utilisation fastidieuse de fragments.
      • Implémenter les indicateurs de page de vue (les points du bas sans bibliothèque ou plug-in supplémentaire)
      • Au contact des indicateurs de la page de visualisation (les points), la navigation sur la page se produit également.
      • Veuillez ne pas oublier d’append vos propres images dans les ressources.
      • N’hésitez pas à commenter et à améliorer.

    A) Voici mon activity_main.xml

            

    B) pager_item.xml

         

    C) MainActivity.java

     import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; public class MainActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener, View.OnClickListener { int[] mResources = {R.drawable.nature1, R.drawable.nature2, R.drawable.nature3, R.drawable.nature4, R.drawable.nature5, R.drawable.nature6 }; ViewPager mViewPager; private CustomPagerAdapter mAdapter; private LinearLayout pager_indicator; private int dotsCount; private ImageView[] dots; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mViewPager = (ViewPager) findViewById(R.id.viewpager); pager_indicator = (LinearLayout) findViewById(R.id.viewPagerCountDots); mAdapter = new CustomPagerAdapter(this, mResources); mViewPager.setAdapter(mAdapter); mViewPager.setCurrentItem(0); mViewPager.setOnPageChangeListener(this); setPageViewIndicator(); } private void setPageViewIndicator() { Log.d("###setPageViewIndicator", " : called"); dotsCount = mAdapter.getCount(); dots = new ImageView[dotsCount]; for (int i = 0; i < dotsCount; i++) { dots[i] = new ImageView(this); dots[i].setImageDrawable(getResources().getDrawable(R.drawable.nonselecteditem_dot)); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT ); params.setMargins(4, 0, 4, 0); final int presentPosition = i; dots[presentPosition].setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { mViewPager.setCurrentItem(presentPosition); return true; } }); pager_indicator.addView(dots[i], params); } dots[0].setImageDrawable(getResources().getDrawable(R.drawable.selecteditem_dot)); } @Override public void onClick(View v) { } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { Log.d("###onPageSelected, pos ", String.valueOf(position)); for (int i = 0; i < dotsCount; i++) { dots[i].setImageDrawable(getResources().getDrawable(R.drawable.nonselecteditem_dot)); } dots[position].setImageDrawable(getResources().getDrawable(R.drawable.selecteditem_dot)); if (position + 1 == dotsCount) { } else { } } @Override public void onPageScrollStateChanged(int state) { } } 

    D) CustomPagerAdapter.java

      import android.content.Context; import android.support.v4.view.PagerAdapter; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; public class CustomPagerAdapter extends PagerAdapter { private Context mContext; LayoutInflater mLayoutInflater; private int[] mResources; public CustomPagerAdapter(Context context, int[] resources) { mContext = context; mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mResources = resources; } @Override public Object instantiateItem(ViewGroup container, int position) { View itemView = mLayoutInflater.inflate(R.layout.pager_item,container,false); ImageView imageView = (ImageView) itemView.findViewById(R.id.imageView); imageView.setImageResource(mResources[position]); /* LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(950, 950); imageView.setLayoutParams(layoutParams);*/ container.addView(itemView); return itemView; } @Override public void destroyItem(ViewGroup collection, int position, Object view) { collection.removeView((View) view); } @Override public int getCount() { return mResources.length; } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } } 

    E) selecteditem_dot.xml

          

    F) nonselecteditem_dot.xml

           

    première image

    entrer la description de l'image ici

    Voici comment je l’ai fait, quelque peu similaire aux solutions ci-dessus. Assurez-vous d’appeler la méthode loadDots () une fois toutes les images téléchargées .

      private int dotsCount; private TextView dotsTextView[]; private void setupAdapter() { adapter = new SomeAdapter(getContext(), images); viewPager.setAdapter(adapter); viewPager.setCurrentItem(0); viewPager.addOnPageChangeListener(viewPagerPageChangeListener); } private final ViewPager.OnPageChangeListener viewPagerPageChangeListener = new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} @Override public void onPageSelected(int position) { for (int i = 0; i < dotsCount; i++) dotsTextView[i].setTextColor(Color.GRAY); dotsTextView[position].setTextColor(Color.WHITE); } @Override public void onPageScrollStateChanged(int state) {} }; protected void loadDots() { dotsCount = adapter.getCount(); dotsTextView = new TextView[dotsCount]; for (int i = 0; i < dotsCount; i++) { dotsTextView[i] = new TextView(getContext()); dotsTextView[i].setText(R.string.dot); dotsTextView[i].setTextSize(45); dotsTextView[i].setTypeface(null, Typeface.BOLD); dotsTextView[i].setTextColor(android.graphics.Color.GRAY); mDotsLayout.addView(dotsTextView[i]); } dotsTextView[0].setTextColor(Color.WHITE); } XML