Как сделать, чтобы кнопка двигалась вместе со страницей, когда палец пользователя перемещает страницу?
У меня ViewPager с двумя customViews. Также у меня есть класс, который отвечает за навигацию (кнопки и точки навигации). Итак, у моих customView есть кнопка. Как я могу заставить эту кнопку двигаться вместе с прокруткой, когда палец пользователя перемещает страницу?. Т е , когда первое представление viewPager перемещается влево (т.е. мы переходим на вторую страницу), кнопка перемещается тоже влево на второй странице.
navigationClass:
public class NavigationView extends LinearLayout {
private Button button;
public NavigationView(@NonNull Context context) {
super(context);
}
public NavigationView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
LayoutInflater mInflater = LayoutInflater.from(context);
View v = mInflater.inflate(R.layout.navigation, this, true);
button = v.findViewById(R.id.button);
}
}
adapter class:
public PagerAdapter(Context context) {
this.context = context;
}
@NotNull
@Override
public Object instantiateItem(@NotNull final ViewGroup container, int position) {
navigationPoint = navigationView.findViewById(R.id.tab_layout);
navigationPoint.setupWithViewPager(viewPager);
navigationPoint.setTabGravity(TabLayout.GRAVITY_CENTER);
final FirstView firstView = new FirstView(context);
View view = null;
switch (position) {
case 0:
view = firstView;
break;
case 1:
view = SecondCustomView.getView(context, container);
break;
}
container.addView(view);
return view;
}
@Override
public int getCount() {
return 2;
}
@Override
public boolean isViewFromObject(@NotNull View view, @NotNull Object object) {
return view == object;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView((View) object);
}
}
activity class:
public class Activity extends AppCompatActivity {
private ViewPager viewPager;
private PagerAdapter pagerAdapter;
private NavigationView navigationView;
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
navigationView = findViewById(R.id.navigation_view);
pagerAdapter = new PagerAdapter(this);
viewPager = findViewById(R.id.viewPager);
viewPager.setAdapter(pagerAdapter);
pagerAdapter.setNavigationView(navigationView);
}
}
Ответы (2 шт):
Как мне кажется ваша кнопка находится не там где ей положено быть, чтобы она могла свайпаться вместе со страницей.
В вашем примере она находится в Активити в которой находится ViewPager и живет отдельной жизнью. Она не может свайпаться вместе с экранами ViewPager-а.
- Вы конечно можете это реализовать руками, но это нетривиальная задача, а вероятнее всего - ненужная.
Более простым и правильным вариантом будет поместить эту кнопку в макет вложенных в ViewPager фрагментов.
Если я не прав - приложите XML разметку, чтоб можно было нагляднее посмотреть где находится ваша кнопка
Что-то типа такого:
pager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
super.onPageScrolled(position, positionOffset, positionOffsetPixels);
button.setTranslationX(-positionOffsetPixels);
}
});
А дальше надо играть с этими x-ами. Проблема в том, что ширина кнопки не нулевая и при скроллинге кнопка ваша должна раздвоиться, т.е. в какой-то момент и слева хвост должен торчать будет и справа. Просто перемещением кнопки вы такого не добьетесь. Видимо нужно две кнопки, тогда проще, одна в -x уходит, другая в ширину пейджера - x. А если скроллинг в обе стороны, то и три кнопки уже нужно (выглядит проще, чем две менять местами).