思路
1.在原有内容前后各加一个view作为过度,滑动到边界时修改定位。
在动画播放完毕时ViewPager.SCROLL_STATE_IDLE使用 viewPager.setCurrentItem(curr, false);修改定位。
问题是假如滑动的速度快于动画播放,在切换最后一页与第一页时则会产生卡顿延迟现象。
public class MainActivity extends AppCompatActivity {
String TAG = "MainActivity";
ViewPager viewPager;
int i;
List<View> date;
Handler handler;
ViewPageAdapter viewPageAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
viewPager = (ViewPager) findViewById(R.id.vp);
date = new ArrayList<View>();
date.add(getLayoutInflater().inflate(R.layout.layout1, null));
date.add(getLayoutInflater().inflate(R.layout.layout2, null));
date.add(getLayoutInflater().inflate(R.layout.layout1, null));
date.add(getLayoutInflater().inflate(R.layout.layout2, null));
date = getViews(date);
viewPageAdapter = new ViewPageAdapter(date);
viewPager.setAdapter(viewPageAdapter);
viewPager.setCurrentItem(1, false);
Pagecl pagecl = new Pagecl();
viewPager.addOnPageChangeListener(pagecl);
//timer.schedule(task, 1000, 1000);
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
viewPager.setCurrentItem(Integer.valueOf(msg.what), true);
}
};
}
class Pagecl implements ViewPager.OnPageChangeListener{
private int curr;
private boolean goCurr = false;
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
Log.e(TAG, "onPageSelected: "+position);
if (position > date.size()-2) {
curr = 1;
goCurr = true;
} else if (position < 2) {
curr = date.size() - 1;
goCurr = true;
} else {
goCurr = false;
}
}
@Override
public void onPageScrollStateChanged(int state) {
if (state == ViewPager.SCROLL_STATE_IDLE && goCurr) {
viewPager.setCurrentItem(curr, false);
goCurr = false;
}
}
}
private List<View> getViews(List<View> data) {
List<View> list = new ArrayList<>();
list.add(data.get(data.size()-1));
for (int i = 0; i < data.size(); i++) {
list.add(data.get(i));
}
list.add(data.get(0));
i = 1;
return list;
}
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
i = viewPager.getCurrentItem();
if (i < 1){
i = viewPageAdapter.getCount()-2;
} else if (i > viewPageAdapter.getCount()-1) {
i=1;
} else {
i++;
}
handler.sendEmptyMessage(i);
}
};
@Override
public void finish() {
super.finish();
timer.cancel();
}
}
public class ViewPageAdapter extends PagerAdapter{
List<View> listView;
public ViewPageAdapter (List<View> listView){
this.listView = listView;
}
@Override
public int getCount() {
return listView.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
if (position < 0) {//避免position为负数
position = listView.size()+position;
}
View view = listView.get(position);
//如果View已经在之前添加到了一个父组件,则必须先remove,否则会抛出IllegalStateException。
if (view.getParent() != null) {
ViewGroup vp =(ViewGroup) view.getParent();
vp.removeView(view);
}
container.addView(view);
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
//Warning:不要在这里调用removeView
}
}
2.设置adapter最大边界为内容的100倍,从中间开始定位左右滑动。
略微提升用户体验。并没有解决问题。
public int getCount() {
return listView.size()*100;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
position %= listView.size();
//...同上
}