ViewPager以前有简单的用过,但没做过自动滚动和循环滚动,在实现起来还是有很多细节需要注意。总体思路:
1.实现循环滚动的思路就是:
1)将PagerAdapter的getCount方法返回值设为无穷大,这样就可以实现无限制的滑动,不会出现滑到头的时候。
2)在每次添加新的View时,都是取当前position对总页数的取余数,然后得到要显示的页View进行添加,删除也是相同操作。
3)设定最开始的要显示的ViewPager的currentItem为Integ.MAX的一半左右,这样保证可以向左循环滑动。
2.实现自动循环的思路:
设定一个变量position来记录当前ViewPager的位置,开启一个新的线程,每隔一定时间对position加1,并发送一个Message给Handler,在Handler中重新setCurrentItem。
3.实现手动滑动与自动滑动结合:
1)利用一个boolean变量isTouched来记录当前是否在触摸ViewPager,在ViewPager的setOnTouchListener中更新该值,只有在isTouched为false时才对Handler发送Message。
2)在手动滑动页面时要改变position值,否则在下次自动滑动时position的值没有更新将报错,所以我们在ViewPager的setOnPageChangeListener中来更新position。
接下来来动手实现自己的思路:
1.首先重写PagerAdapter,实现思路一
package com.example.test;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
public class MyPagerAdapter extends PagerAdapter {
private List<View> mList;
public MyPagerAdapter(Context context, List<Integer> list) {
mList = new ArrayList<View>();
LinearLayout.LayoutParams mParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
for (int i = 0; i < list.size(); i++) {
ImageView mImageView = new ImageView(context);
mImageView.setLayoutParams(mParams);
mImageView.setBackgroundResource(list.get(i));
mList.add(mImageView);
}
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0 == arg1;
}
//销毁上一页
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// TODO Auto-generated method stub
position = position % mList.size();
container.removeView(mList.get(position));
}
<pre name="code" class="java"> //添加下一页
@Override
public Object instantiateItem(ViewGroup container, int position) {
// TODO Auto-generated method stub
position = position % mList.size();
container.addView(mList.get(position));
return mList.get(position);
}
}
2.在Activity中实现思路二和三package com.example.test;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
public final class MainActivity extends Activity {
private ViewPager mPager;
int position = 50000;
private boolean isTouched = false;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
mPager.setCurrentItem(position);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPager = (ViewPager) findViewById(R.id.main_viewpager);
List<Integer> list = new ArrayList<Integer>();
list.add(R.drawable.image1);
list.add(R.drawable.image2);
list.add(R.drawable.image3);
list.add(R.drawable.image4);
MyPagerAdapter adapter = new MyPagerAdapter(this, list);
mPager.setAdapter(adapter);
mPager.setCurrentItem(position);
//实现思路三
mPager.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
isTouched = true;
break;
case MotionEvent.ACTION_UP:
isTouched = false;
default:
break;
}
return false;
}
});
mPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
position = arg0;
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
});
//实现思路二
Thread change = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
if (!isTouched) {
position++;
mHandler.sendEmptyMessage(0);
}
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
change.start();
}
}
本文详细介绍了如何在Android开发中实现ViewPager的自动循环滚动和手动切换页面。首先,通过设置getCount返回无穷大实现无限滚动,再利用position取余数添加和删除页面。其次,创建线程并设定Handler,定时更新position实现自动循环。最后,通过isTouched变量判断用户是否在触摸,结合OnTouchListener和OnPageChangeListener确保手动滑动与自动滑动的平滑过渡。

207

被折叠的 条评论
为什么被折叠?



