效果图
思考
- 要实现上面的效果,布局上使用viewpager控件,还需一个textview用来显示文字,一个LinearLayout用来存放动态创建的小圆点。
- 用handler隔几秒发送一个消息来控制图片的轮播切换。
- 要使在最后一张图片继续左滑时,跳到第一张图片上,可以将viewpager适配器中的getCount()方法中返回最大的整数,在instantiateItem中通过对list的长度取模来设置当前的页。(不要忘了在获取viewpager的currentItem时也要进行取模操作)
- 要使第一张图片右滑时,跳到最后一张图片上,可以在初始化数据后,设置viewpager的currentItem为整数最大值的一半。但这时可能会造成进入时viewpager不在第一个页面,解决办法也很简单:用最大值的一半模上数据集合的大小,这个值就是多出来的页数的值,减去这个值就可以。(
viewPager.setCurrentItem(Integer.MAX_VALUE/2 - Integer.MAX_VALUE/2%list.size());
)
步骤
布局文件
主页面布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="200dip" >
</android.support.v4.view.ViewPager>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/viewpager"
android:background="#7000"
android:orientation="vertical"
android:gravity="center_horizontal"
android:padding="4dip" >
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="文本内容"
android:textColor="#fff" />
<LinearLayout
android:id="@+id/points"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="4dip" >
</LinearLayout>
</LinearLayout>
</RelativeLayout>
viewpager适配器的item布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
android:src="@drawable/a" />
</LinearLayout>
- 主函数
public class MainActivity extends Activity {
public static final int DELAY_Millis = 5000;
private ViewPager viewPager;
private TextView textView;
private LinearLayout points;
private List<Data> list = new ArrayList<Data>();
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
viewPager.setCurrentItem(viewPager.getCurrentItem()+1);
handler.sendEmptyMessageDelayed(0, DELAY_Millis);
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initViews();
initListeners();
initData();
}
private void initViews() {
setContentView(R.layout.activity_main);
viewPager = (ViewPager) this.findViewById(R.id.viewpager);
textView = (TextView) this.findViewById(R.id.tv);
points = (LinearLayout) this.findViewById(R.id.points);
}
private void initListeners() {
viewPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
updatePointAndText();
}
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
private void initData() {
list.add(new Data(R.drawable.a, "巩俐不低俗,我就不能低俗"));
list.add(new Data(R.drawable.b, "朴树又回来了,再唱经典老歌引百万人同唱啊"));
list.add(new Data(R.drawable.c, "揭秘北京电影如何升级"));
list.add(new Data(R.drawable.d, "乐视网TV版大放送"));
list.add(new Data(R.drawable.e, "热血屌丝的反杀"));
initPoints();
viewPager.setAdapter(new MyAdapter());
viewPager.setCurrentItem(Integer.MAX_VALUE/2 - Integer.MAX_VALUE/2%list.size());
updatePointAndText();
handler.sendEmptyMessageDelayed(0, DELAY_Millis);
}
private void initPoints() {
for (int i = 0; i < list.size(); i++) {
View view = new View(this);
LayoutParams params = new LayoutParams(DensityUtils.dip2px(this, 5), DensityUtils.dip2px(this, 5));
if (i != 0) {
params.leftMargin = DensityUtils.dip2px(this, 5);
}
view.setLayoutParams(params);
view.setBackgroundResource(R.drawable.selector_points);
points.addView(view);
}
}
private void updatePointAndText() {
int currentItem = viewPager.getCurrentItem()%list.size();
for (int i = 0; i < points.getChildCount(); i++) {
points.getChildAt(i).setEnabled(currentItem == i);
}
textView.setText(list.get(currentItem).getPicdesc());
}
class MyAdapter extends PagerAdapter {
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View view = View.inflate(MainActivity.this, R.layout.adapter_view,
null);
ImageView iv = (ImageView) view.findViewById(R.id.iv);
Data data = list.get(position%list.size());
int picId = data.getPicId();
iv.setImageResource(picId);
container.addView(view);
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
}