Aligner les vues enfant dans le centre de la ViewPager android
J'ai besoin de l'enfant de voir comme le centre de la ViewPager et aussi, je tiens à montrer une certaine partie de la suivante et précédente points de vue à la vue en cours sur les côtés(comme l'écran ci-dessous 1). Mais actuellement, le point de vue actuel est en commençant à gauche de la ViewPager(comme prévu, l'écran ci-dessous 2). Comment puis-je y parvenir?
Voici mon code..
MyViewPagerAdapter
public class MyViewPagerAdapter extends PagerAdapter {
private Activity mActivity;
private int mPageCount;
public MyViewPagerAdapter(Activity activity,int pageCount) {
mActivity = activity;
mPageCount = pageCount;
}
@Override
public int getCount() {
return mPageCount;
}
@Override
public boolean isViewFromObject(View view, Object obj) {
return (view ==(View)obj);
}
@Override
public Object instantiateItem(ViewGroup container,final int position) {
ViewGroup viewGroup = (ViewGroup)mActivity.getLayoutInflater().inflate(
R.layout.item_view, null);
viewGroup.setBackgroundColor(randomColor());
TextView textView = (TextView)viewGroup.findViewById(R.id.textView1);
textView.setText("Page: "+(position+1));
Button button = (Button) viewGroup.findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mActivity, "Hey, Its clicked!!! at page "+(position+1), Toast.LENGTH_LONG).show();
}
});
container.addView(viewGroup);
return viewGroup;
}
Random rnd = new Random();
private int randomColor(){
return Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));
}
@Override
public void destroyItem(ViewGroup collection, int position, Object view) {
//must be overridden else throws exception as not overridden.
Log.d("Tag", collection.getChildCount()+"");
collection.removeView((View) view);
}
@Override
public float getPageWidth(int position) {
return 0.8f;
}
}
MainActivity
public class MainActivity extends Activity {
private ViewPager viewPager;
LinearLayout linearLayout;
private int ID = 100;
private final int count = 8;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = (ViewPager) findViewById(R.id.viewPager);
linearLayout = (LinearLayout) findViewById(R.id.indicator_layout);
generateIndicators(count);
MyViewPagerAdapter adapter = new MyViewPagerAdapter(this, count);
viewPager.setAdapter(adapter);
viewPager.setOnPageChangeListener(new OnPageChangeListener() {
int oldPosition = 0;
@Override
public void onPageSelected(int position) {
//this changes the old position's view state image
((TextView)linearLayout.getChildAt(oldPosition)).setText("");
oldPosition = position;
//this changes the current position's view state image
((TextView)linearLayout.getChildAt(position)).setText((position+1)+"");
}
//this method will be called repeatedly upto another item comes as front one(active one)
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
//this will be called as per scroll state
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
viewPager.setOffscreenPageLimit(4);
}
private void generateIndicators(int count) {
///Converts 14 dip into its equivalent px
int padd = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 3, getResources().getDisplayMetrics());
for(int i=0;i<count;i++){
TextView textView = new TextView(this);
textView.setId(ID+i);
final int currentItem = i;
textView.setBackgroundResource(R.drawable.white_cell);
textView.setPadding(padd,padd,padd,padd);
///Converts 14 dip into its equivalent px
int size = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, getResources().getDisplayMetrics());
textView.setTextSize(size);
textView.setGravity(Gravity.CENTER);
///Converts 14 dip into its equivalent px
int px = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 30, getResources().getDisplayMetrics());
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(px, px);
linearLayout.addView(textView,params);
}
((TextView)linearLayout.getChildAt(0)).setText("1");
}
}
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" >
</android.support.v4.view.ViewPager>
<LinearLayout
android:id="@+id/indicator_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="19dp" >
</LinearLayout>
</RelativeLayout>
item_view.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="100dp"
android:layout_height="match_parent"
android:id="@+id/root_view"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="click me" />
</LinearLayout>
Écran actuel
devrait écran
Je l'ai fait maintenant par la personnalisation de la ViewPager.
Avez-vous fait? Je suis confronté à la même question @noundla
oui. Donnez-moi votre mail , je peux vous l'envoyer à l'université.
merci beaucoup. mon adresse: [email protected]
- Je vous envoyer du courrier. vérifiez-le et laissez-moi savoir.
Avez-vous fait? Je suis confronté à la même question @noundla
oui. Donnez-moi votre mail , je peux vous l'envoyer à l'université.
merci beaucoup. mon adresse: [email protected]
- Je vous envoyer du courrier. vérifiez-le et laissez-moi savoir.
OriginalL'auteur Noundla | 2013-04-25
Vous devez vous connecter pour publier un commentaire.
Pour une application j'ai mis en place similaire à la suivante, avec la norme
ViewPager
:Faire des pages en plein écran avec le contenu réel dans une maquette intérieure. Par exemple, faire le plein écran mise en page d'un
RelativeLayout
avec un fond transparent et le contenu réel d'un autreRelativeLayout
centré dans le parent. Si je me souviens bien, la raison en est que, avec juste l'intérieure de la mise en page en page, leViewPager
n'aurait pas pris toute la largeur de l'écran sur certains appareils tels que le Galaxy Nexus.Utilisation
ViewPager.setPageMargin()
pour configurer un négatif marge de la page c'est à dire combien de la page suivante/précédente que vous souhaitez afficher. Assurez-vous que il ne chevauche la transparence de la région de la mère en plein écran mise en page.Appel
ViewPager.setOffscreenPageLimit()
pour régler le off-page d'écran de compter pour au moins2
de la valeur par défaut1
pour assurer la fluidité de la pagination en fait à créer des pages hors de l'écran. Sinon, vous verrez suivante/précédente pages dessinées alors qu'il est déjà partiellement afficher sur l'écran.Voilà comment j'ai fait mais à l'aide de FrameLayouts. Cette idée a été de renoncer à l'aide de la getPageWidth() (autorisation à 1.0 f) et l'utilisation de la marge négative à apporter dans les pages adjacentes. Dans ma mise en page, j'ai utilisé une racine FrameLayout (params n'a pas beaucoup d'importance, car ils vont être fixés par le ViewPager) et d'un enfant FrameLayout avec une largeur fixe ont été j'ai mis tout le contenu de la page. Ensuite dans mon activité, je voudrais calculer la marge négative que les suivantes: marge = viewpager.getWidth() - pageWidth; viewpager.setPageMargin (marge); où pageWidth est la largeur fixe de l'enfant FrameLayout que j'ai précisé ci-dessus
yup! de ce fait il
OriginalL'auteur laalto
Pour quiconque bouleversé que l'OP n'a pas de mise à jour de sa question avec la solution ici est un lien qui explique, avec un minimum d'effort, comment en sortir en XML: http://blog.neteril.org/blog/2013/10/14/android-tip-viewpager-with-protruding-children/
Fondamentalement, lorsque vous déclarez votre viewpager en XML, de lui donner le même à gauche et à droite de rembourrage et jeu android:clipToPadding="false". (Le clipToPadding est manquant dans son exemple xml et nécessaire pour obtenir cet effet)
OriginalL'auteur Gilleland
Enfin, j'ai ajouté ma solution pour cette question dans GitHub. J'ai fait quelques jolies astuces pour obtenir la solution de rechange. Vous pouvez obtenir le projet à partir du lien ci-dessous(en Fait j'ai prévu de créer un blog avec l'explication , mais je force trop de temps pour le faire).
Ici est la lien(https://github.com/noundla/Sunny_Projects/tree/master/CenterLockViewPager)
Vous devez copier les fichiers à partir de
com.noundla.centerviewpagersample.comps
ensemble à votre projet. Et vous pouvez voir l'utilisation de la Viewpager dansMainActivity
classe.S'il vous plaît laissez-moi savoir si quelqu'un a des problèmes avec cela.
OriginalL'auteur Noundla
J'ai trouvé la solution dans ce post, ci-dessous le code que j'ai utilisé:
dpToPx code:
C'est tout ce que vous devez
OriginalL'auteur Sergey Mohov
J'ai dû centre de la page actuelle en vue de radiomessagerie avec en page différentes largeurs, de sorte que la solution avec des remplissages n'était pas adapté. Aussi utilisateur de défilement a été désactivé (il était à l'onglet de la barre de vue de radiomessagerie, défile à un autre point de vue pager). Voici une solution très simple à faire - il suffit de remplacer ViewPager.ScrollTo méthode comme ceci (code C#, Xamarin):
Et si vous calculez la largeur de la page pour chaque fragment n'oubliez pas de les mettre en cache dans la gamme.
OriginalL'auteur Alexander Danilov
Vous pouvez utiliser un rembourrage pour viewPager et définir clipToPadding vrai
Java
Kotlin
OriginalL'auteur Rasoul Miri
Étendre HorizontalScrollView de la classe en tant que parent pour le défilement de l'affichage. Dans le onMeasure() méthode, vous pouvez spécifier la largeur et la hauteur de chaque enfant. Peu encombrant, mais l'effet sera bonne et vous pouvez avoir une bonne influence sur votre enfant consulter.
OriginalL'auteur Ashwin