到达视图寻呼机末尾时将视图寻呼机移动到第一项
Moving view pager to first item when the end of view pager is reached
以下是我的instantiateItem方法
@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.img);
TextView textView = (TextView) itemView.findViewById(R.id.txt);
imageView.setImageResource(mResources[position]);
textView.setText(mCompanies[position]);
container.addView(itemView);
return itemView;
}
我想通过滚动检测用户是否已经到达视图寻呼机的末尾,如果用户已经到达末尾,我想从左到右摇动整个 viewpager。我该怎么做?
你可以为此使用 OnPageChangeListener
pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
if(position == lastPosition){
pager.setCurrentItem(0, true);
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
@Override
public void onPageScrollStateChanged(int state) {
//mImageResource is image array
if(state<mImageResources.length)
{
//intro_images is viewpager
intro_images.setCurrentItem(0,true);
}
}
一种解决方案是覆盖 viewPager 的触摸侦听器以执行所需的操作。您可以在此视频中看到它是如何工作的 ViewPager Example。
我在这里做的是存储 touchDown x 坐标并将其与 touchUp x 坐标进行比较,以确定它是从左到右还是从右到左的移动。因为 x 从左边开始,从 0 开始,向右增加。所以当downX小于upX时,它是从左向右移动,反之亦然。
对于从右到左,我将 viewPager 向前移动,如果它在最后一个位置,则移动到第一个。同样,对于从左到右,我将 viewPager 向后移动,如果它位于第一个位置,则移动到最后一个。
覆盖最后一行中的 TouchListener return 'true'。
viewPager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
// store the x coordinate of touch down
actionDownX = event.getX();
break;
case MotionEvent.ACTION_UP:
int currentPosition = viewPager.getCurrentItem();
// the x coordinate of action up
float actionUpX = event.getX();
// Swiped from Left to Right -> Move Backward
if (actionDownX < actionUpX) {
// Move to Last item
if (currentPosition == 0) {
viewPager.setCurrentItem(size - 1, true);
}
// Move Backward
else {
int nextPosition = Math.max(0, currentPosition - 1);
viewPager.setCurrentItem(nextPosition, true);
}
}
// Swiped from Right to Left -> Move Forward
else if (actionDownX > actionUpX) {
// Move to First item
if (currentPosition == size - 1) {
viewPager.setCurrentItem(0, true);
}
// Move Forward
else {
int nextPosition = Math.min(size - 1, currentPosition + 1);
viewPager.setCurrentItem(nextPosition, true);
}
}
}
// This is important. To override the default behavior, return true
return true;
}
});
注意:请注意,这不是一个完整的解决方案,只是关于如何执行所需操作的一个想法。滑动时,它的行为并不完全像 viewPager(您可以在视频中看到)。所以建议不要只是 copy-paste 这段代码,而应该 expand/improve 鳕鱼并添加所有必要的检查。
以下是我的instantiateItem方法
@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.img);
TextView textView = (TextView) itemView.findViewById(R.id.txt);
imageView.setImageResource(mResources[position]);
textView.setText(mCompanies[position]);
container.addView(itemView);
return itemView;
}
我想通过滚动检测用户是否已经到达视图寻呼机的末尾,如果用户已经到达末尾,我想从左到右摇动整个 viewpager。我该怎么做?
你可以为此使用 OnPageChangeListener
pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
if(position == lastPosition){
pager.setCurrentItem(0, true);
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
@Override
public void onPageScrollStateChanged(int state) {
//mImageResource is image array
if(state<mImageResources.length)
{
//intro_images is viewpager
intro_images.setCurrentItem(0,true);
}
}
一种解决方案是覆盖 viewPager 的触摸侦听器以执行所需的操作。您可以在此视频中看到它是如何工作的 ViewPager Example。
我在这里做的是存储 touchDown x 坐标并将其与 touchUp x 坐标进行比较,以确定它是从左到右还是从右到左的移动。因为 x 从左边开始,从 0 开始,向右增加。所以当downX小于upX时,它是从左向右移动,反之亦然。
对于从右到左,我将 viewPager 向前移动,如果它在最后一个位置,则移动到第一个。同样,对于从左到右,我将 viewPager 向后移动,如果它位于第一个位置,则移动到最后一个。
覆盖最后一行中的 TouchListener return 'true'。
viewPager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
// store the x coordinate of touch down
actionDownX = event.getX();
break;
case MotionEvent.ACTION_UP:
int currentPosition = viewPager.getCurrentItem();
// the x coordinate of action up
float actionUpX = event.getX();
// Swiped from Left to Right -> Move Backward
if (actionDownX < actionUpX) {
// Move to Last item
if (currentPosition == 0) {
viewPager.setCurrentItem(size - 1, true);
}
// Move Backward
else {
int nextPosition = Math.max(0, currentPosition - 1);
viewPager.setCurrentItem(nextPosition, true);
}
}
// Swiped from Right to Left -> Move Forward
else if (actionDownX > actionUpX) {
// Move to First item
if (currentPosition == size - 1) {
viewPager.setCurrentItem(0, true);
}
// Move Forward
else {
int nextPosition = Math.min(size - 1, currentPosition + 1);
viewPager.setCurrentItem(nextPosition, true);
}
}
}
// This is important. To override the default behavior, return true
return true;
}
});
注意:请注意,这不是一个完整的解决方案,只是关于如何执行所需操作的一个想法。滑动时,它的行为并不完全像 viewPager(您可以在视频中看到)。所以建议不要只是 copy-paste 这段代码,而应该 expand/improve 鳕鱼并添加所有必要的检查。