PagerAdapter, вторая страница видна на старте
Я пытаюсь выяснить, как сделать следующее с пользовательским интерфейсом Android. Я не думаю, что я единственный, кто столкнулся с этой проблемой, но я не знаю, что искать, и пока не нашел полезной информации.
Моя ситуация:
На данный момент у меня есть класс, расширяющий FragmentStatePagerAdapter для получения фрагментов для моих страниц. У меня есть один "основной" фрагмент (который не должен заполнять экран!! <- очень важная информация здесь) и несколько последующих страниц заполнения экрана, которые появятся позже.
У меня также есть PageTransformer, который преобразует страницы, как будто они уже находятся за текущей страницей.) Аналогично DepthPageTransformer на этой странице: http://developer.android.com/training/animation/screen-slide.html
Мой стартовый экран должен выглядеть так:
Я объясню это вкратце: область с закругленным углом слева является главной страницей, которая не заполняет экран. За этой главной страницей вторая страница уже должна быть видна в фоновом режиме. Когда я проведу по главной странице влево, вторая страница станет следующей активной страницей.
Итак, вот проблема:
Вторая страница не отображается в фоновом режиме, пока я не начну преобразовывать (смахивать) главную страницу. Я начал строить сценарий (еще не законченный из-за проблемы), и он выглядит так:
Темный градиент сзади является стандартным градиентом андроида. Голубая область - это растянутое изображение с прозрачностью (в случае, если это часть головоломки)
Поэтому, когда я начинаю перелистывать главную страницу, она внезапно выглядит следующим образом. После возврата на главную страницу вторая часть остается видимой:
Это ситуация, которая должна выглядеть с самого начала.
Как я могу добиться этого, чтобы две страницы были видны с самого начала? Это основной код активности (в основном это код из данной ссылки на android dev без комментариев):
public class MainActivity extends FragmentActivity {
private static final int NUM_PAGES = 5;
private ViewPager mPager;
private PagerAdapter mPagerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_slider);
// Instantiate a ViewPager and a PagerAdapter.
mPager = (ViewPager) findViewById(R.id.pager);
mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
mPager.setAdapter(mPagerAdapter);
mPager.setPageTransformer(true, new DepthPageTransformer());
}
@Override
public void onBackPressed() {
if (mPager.getCurrentItem() == 0) {
super.onBackPressed();
} else {
mPager.setCurrentItem(mPager.getCurrentItem() - 1);
}
}
/**
* A simple pager adapter that represents 5 ScreenSlidePageFragment objects,
* in sequence.
*/
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
public ScreenSlidePagerAdapter(FragmentManager fragmentManager) {
super(fragmentManager);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new ScreenMainSlideFragment();
}
return new ScreenSlideFragment();
}
@Override
public int getCount() {
return NUM_PAGES;
}
}
}
А вот PageTransformer (может быть, есть решение):
public class DepthPageTransformer implements PageTransformer {
private static float MIN_SCALE = 1f;
public void transformPage(View view, float position) {
int pageWidth = view.getWidth();
if (position < -1) { // [-Infinity,-1)
// This page is way off-screen to the left.
view.setAlpha(0);
} else if (position <= 0) { // [-1,0]
// Use the default slide transition when moving to the left page
view.setAlpha(1);
view.setTranslationX(0);
view.setScaleX(1);
view.setScaleY(1);
} else if (position <= 1) { // (0,1]
// Fade the page out.
view.setAlpha(0.75f + (1 - position) * 0.25f);
// Counteract the default slide transition
view.setTranslationX(pageWidth * -position);
// Scale the page down (between MIN_SCALE and 1)
float scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position));
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor);
} else { // (1,+Infinity]
// This page is way off-screen to the right.
view.setAlpha(0);
}
}
}
Большое спасибо!
1 ответ
Я не уверен, что это решит вашу проблему полностью, но вы смотрели на метод getPageWidth адаптера вашего ViewPager. Это может помочь вам, куда вы хотите пойти:
https://developer.android.com/reference/android/support/v4/view/PagerAdapter.html
Верните значение меньше 1 в реализации вашего адаптера:
...
private static final int POS_MAIN_PAGE = 0;
private static final float WIDTH_MAIN_PAGE = 0.9f;
...
...
@Override
public float getPageWidth (int position) {
if (position == POS_MAIN_PAGE) {
return WIDTH_MAIN_PAGE;
}
return 1f;
}
....
Обновление после комментария ОП:
Если 2-я страница должна быть видна одновременно с первой, то ViewPager
не может быть правильным контролем для вас. Страницы в ViewPager
показаны рядом друг с другом, а не друг над другом.
Что вы можете сделать, так это показать свою главную и "вторую" страницу на первой странице (позиция ==0) вашего ViewPager
(а ViewGroup
/Fragment
содержащий как главную, так и "2-ю" страницы, где ваша главная страница немного меньше). Ваша "вторая" страница исправлена, вашей главной страницей может быть выдвижной ящик. Когда пользователь проводит пальцем влево на главных страницах (то есть на выдвижном ящике), главная страница может исчезать из поля зрения, и "2-я" страница остается на месте. Когда пользователь проводит пальцем влево на "2-й" странице, "3-я" страница в вашем ViewPager может отображаться обычным способом, как ViewPager
перемещается с одного экрана на другой, и (и главная, и вторая страница) исчезают из поля зрения.