这是学习到后自己写的一个简单地轮播图,有自定义的与轮播图同事轮转的点,图片,文字,如有雷同纯属模仿
package com.itkangda.viewpagerdemo;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;
public class MainActivity extends Activity implements OnPageChangeListener {
private List<ImageView> imageViewList; // Viewpager的数据
private ViewPager mViewPager;
private LinearLayout llPointGroup;
private TextView tvImageDescription;
private String[] imageDescriptions;
private int previousPosition = 0; // 前一个被选中的position
private boolean isStop = false;
@Override
protected void onDestroy() {
super.onDestroy();
// 把正在循环切换的任务给停止掉
isStop = true;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
new Thread(new Runnable() {
@Override
public void run() {
// 每隔5秒钟, 来切换一张图片
while(!isStop) {
System.out.println("正在切换图片..");
// 运行在主线程中的任务
runOnUiThread(new Runnable() {
public void run() {
mViewPager.setCurrentItem(mViewPager.getCurrentItem() + 1);
};
});
SystemClock.sleep(5000);
}
}
}).start();
}
private void initView() {
mViewPager = (ViewPager) findViewById(R.id.viewpager);
tvImageDescription = (TextView) findViewById(R.id.tv_image_description);
llPointGroup = (LinearLayout) findViewById(R.id.ll_point_group);
initData();
MyAdapter mAdapter = new MyAdapter();
mViewPager.setAdapter(mAdapter); // 当执行完此行代码, ViewPager会去找MyAdapter去要数据.
mViewPager.setOnPageChangeListener(this);
// 设置默认选中的点和图片对应的描述信息.
previousPosition = 0;
llPointGroup.getChildAt(previousPosition).setEnabled(true);
tvImageDescription.setText(imageDescriptions[previousPosition]);
// 把ViewPager设置为默认选中Integer.MAX_VALUE / 2;
int m = (Integer.MAX_VALUE / 2) % imageViewList.size();
int currentPosition = Integer.MAX_VALUE / 2 - m;
mViewPager.setCurrentItem(currentPosition);
}
private void initData() {
imageDescriptions = new String[] {
"我是叶良辰",
"有个bug",
"加个点击事件",
"点击的时候",
"取消自动轮播"
};
int[] imageResIDs = {
R.drawable.a,
R.drawable.b,
R.drawable.c,
R.drawable.d,
R.drawable.e
};
imageViewList = new ArrayList<ImageView>();
ImageView iv;
View v;
LayoutParams params;
for (int i = 0; i < imageResIDs.length; i++) {
iv = new ImageView(this);
iv.setBackgroundResource(imageResIDs[i]);
imageViewList.add(iv);
// 每循环一次需要向LinearLayout中添加一个点的view对象
v = new View(this);
v.setBackgroundResource(R.drawable.point_bg);
params = new LayoutParams(5, 5);
if(i != 0) {
// 当前不是第一个点, 需要设置左边距
params.leftMargin = 5;
}
v.setLayoutParams(params);
v.setEnabled(false);
llPointGroup.addView(v);
}
}
class MyAdapter extends PagerAdapter {
/**
* 返回的int的值, 会作为ViewPager的总长度来使用.
*/
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
/**
* 判断是否使用缓存, 如果返回的是true, 使用缓存. 不去调用instantiateItem方法创建一个新的对象
*/
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
/**
* 初始化一个条目
* position 就是当前需要加载条目的索引
*/
@Override
public Object instantiateItem(ViewGroup container, int position) {
// 把position对应位置的ImageView添加到ViewPager中
ImageView iv = imageViewList.get(position % imageViewList.size());
mViewPager.addView(iv);
// 把当前添加ImageView返回回去.
return iv;
}
/**
* 销毁一个条目
* position 就是当前需要被销毁的条目的索引
*/
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// 把ImageView从ViewPager中移除掉
mViewPager.removeView(imageViewList.get(position % imageViewList.size()));
}
}
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
// TODO Auto-generated method stub
}
/**
* 当ViewPager页面被选中时, 触发此方法
* @param position 当前被选中的页面的索引
*/
@Override
public void onPageSelected(int position) {
int newPosition = position % imageViewList.size();
// 把当前选中的点给切换了, 还有描述信息也切换
llPointGroup.getChildAt(previousPosition).setEnabled(false);
llPointGroup.getChildAt(newPosition).setEnabled(true);
tvImageDescription.setText(imageDescriptions[newPosition]);
// 把当前的索引赋值给前一个索引变量, 方便下一次再切换.
previousPosition = newPosition;
}
@Override
public void onPageScrollStateChanged(int state) {
}
}
</pre><pre class="java" name="code">
XML处理
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="fill_parent"
android:layout_height="200dip" >
</android.support.v4.view.ViewPager>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/viewpager"
android:background="#77000000"
android:gravity="center_horizontal"
android:orientation="vertical"
android:padding="5dip" >
<TextView
android:id="@+id/tv_image_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我是默认的图片描述信息"
android:textColor="#FFFFFF"
android:textSize="16sp" />
<LinearLayout
android:id="@+id/ll_point_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dip"
android:orientation="horizontal" >
</LinearLayout>
</LinearLayout>
</RelativeLayout>
选择器
<div><?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"></div><div>
</div><div> <item android:drawable="@drawable/point_focus" android:state_enabled="true"></item>
<item android:drawable="@drawable/point_normal" android:state_enabled="false"></item></div><div>
</div><div></selector></div>
选中状态点
<div><?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" ></div><div>
</div><div> <corners android:radius="5dip" /></div><div>
</div><div> <solid android:color="@android:color/white" /></div><div>
</div><div></shape></div>
正常状态点
<div><?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" ></div><div>
</div><div> <corners android:radius="5dip" /></div><div>
</div><div> <solid android:color="@android:color/darker_gray" /></div><div>
</div><div></shape></div>