Je veux append 3 points bas à mon ViewPager, comme ceci.
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
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:
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.
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
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