How to vertically position a ViewPager in a horizontal Swiped ViewPager

I am setting up my Android app to navigate in four directions, I use the ViewPager to scroll horizontally and the VerticalViewPager to scroll vertically (this is similar to modifying the DirectionalViewPager since the original is outdated). the problem is that with the ViewPager in the VerticalViewPager only the VerticalViewPager works, and with the VerticalViewPager in the ViewPager only the Horizontal swipe works, this is my code for the first state:

 VerticalViewPager verticalViewPager = (VerticalViewPager) findViewById(R.id.vertical_pager); verticalViewPager.setAdapter(new TabPagerAdapter(getSupportFragmentManager())); verticalViewPager.setPageTransformer(true, new ViewPager.PageTransformer() { @Override public void transformPage(View view, float position) { int pageWidth = view.getWidth(); int pageHeight = view.getHeight(); if (position < -1) { // [-Infinity,-1) // This page is way off-screen to the left. view.setAlpha(0); } else if (position <= 1) { // [-1,1] // Modify the default slide transition to shrink the page as well float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position)); float vertMargin = pageHeight * (1 - scaleFactor) / 2; float horzMargin = pageWidth * (1 - scaleFactor) / 2; if (position < 0) { view.setTranslationY(vertMargin - horzMargin / 2); } else { view.setTranslationY(-vertMargin + horzMargin / 2); } // Scale the page down (between MIN_SCALE and 1) view.setScaleX(scaleFactor); view.setScaleY(scaleFactor); // Fade the page relative to its size. view.setAlpha(MIN_ALPHA + (scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA)); } else { // (1,+Infinity] // This page is way off-screen to the right. view.setAlpha(0); } } }); verticalViewPager.setCurrentItem(1); TabPagerAdapter TabAdapter = new TabPagerAdapter(getSupportFragmentManager()); ViewPager Tab = (ViewPager) findViewById(R.id.pager); Tab.setAdapter(TabAdapter); Tab.setCurrentItem(1); 

TabPagerAdapter Class:

 public class TabPagerAdapter extends FragmentStatePagerAdapter { public TabPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int i) { switch (i) { case 0: //Fragment for Left side return new AC_Left(); case 1: //Fragment for Center side return new AC_Center(); case 2: //Fragment for Right side return new AC_Right(); } return null; } @Override public int getCount() { return 3; } } 

AC_Left , AC_Right, and AC_Center are similar fragments , with the exception of the returned layout :

 public class AC_Center extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View ac_center_frag = inflater.inflate(R.layout.ac_center_fragment, container, false); return ac_center_frag; } } 

And the XML file:

 <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" android:background="@drawable/bg" > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/buttonBar" android:orientation="vertical" android:weightSum="1" > <com.example.myapp.VerticalViewPager android:id="@+id/vertical_pager" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" > <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" /> </com.example.myapp.VerticalViewPager> </LinearLayout> </RelativeLayout> 
+6
source share
1 answer

I created a library for this with an example application and put it on github. It mainly supports the presentation port and updates the presentation pager every time the page changes. There is an adapter that you must implement in order to give it fragments for each row, the column index. It is admittedly a bit hacked, but should work on average. There is a small mask that you can set so that it turns in any directions that you need. Set it to GRID_WRAP_NONE so that it is not fully completed.

https://github.com/btate/BTGridPager-Android

It may not be exactly what you need, but you need to start.

+4
source

All Articles