MainActivity.java:
package zkx.com.viewpager;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener {
private ViewPager viewPager;
private ArrayList<ImageView> imageListView;
private LinearLayout ll_point_contaniner;
private String[] contentDesc;
private TextView tv_desc;
private int priviousSelectedPosition = 0;
boolean isRunning = false;//isUIvisable
// private ArrayList<View> pointsView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();//初始化布局View视图
//Model数据
initData();
//Controller控制器
initAdapter();
//开启自动轮播循环
new Thread(){
@Override
public void run() {
isRunning = true;
while(isRunning ){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
runOnUiThread(new Runnable() {
@Override
public void run() {
System.out.println("设置当前位置: " + viewPager.getCurrentItem());
//往下跳一位
viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
}
});
}
}
}.start();
}
@Override
protected void onDestroy() {
super.onDestroy();
isRunning=false;//界面销毁置为false
}
private void initView() {
viewPager= (ViewPager) findViewById(R.id.viewPager);
viewPager.setOnPageChangeListener(this);//设置滚动监听
//viewPager.setOffscreenPageLimit(1);//左右各保留几个对象
ll_point_contaniner= (LinearLayout) findViewById(R.id.ll_point_contaniner);
tv_desc = (TextView) findViewById(R.id.tv_desc);
}
private void initData() {
//初始化要显示的数据
//图片资源id数组
int[] imageResIds=new int[]{R.drawable.a,R.drawable.b,R.drawable.c,R.drawable.d,R.drawable.e};
//文本描述
contentDesc = new String[]{
"周杰伦",
"张学友",
"李克勤",
"陈奕迅",
"郑中基"
};
//初始化要展示的5个imageView
imageListView= new ArrayList<ImageView>();
// pointsView =new ArrayList<View>();
ImageView imageView;
View pointView;
LinearLayout.LayoutParams layoutParams;
for (int i = 0; i <imageResIds.length ; i++) {
imageView = new ImageView(this);
imageView.setBackgroundResource(imageResIds[i]);
imageListView.add(imageView);
//加小白点,指示器
pointView=new View(this);
pointView.setBackgroundResource(R.drawable.seletor_bg_point);
layoutParams= new LinearLayout.LayoutParams(5,5);
if(i!=0) layoutParams.leftMargin = 15;
pointView.setEnabled(false);
ll_point_contaniner.addView(pointView,layoutParams);
}
}
private void initAdapter() {
ll_point_contaniner.getChildAt(0).setEnabled(true);
tv_desc.setText(contentDesc[0]);
//设置适配器
viewPager.setAdapter(new MyAdpater());
//(为了实现向左无限循环)默认到中间的某个位置
// int pos=Integer.MAX_VALUE/2-(Integer.MAX_VALUE/2%imageListView.size());
viewPager.setCurrentItem(5000000);//设置到某个位置
}
class MyAdpater extends PagerAdapter{
@Override
public int getCount() {
// return imageListView.size();
return Integer.MAX_VALUE;//伪无限循环
}
//1.返回要显示的内容,创建条目
@Override
public Object instantiateItem(ViewGroup container, int position) {
System.out.println("instantiateItem初始化: "+position);
//container:容器:ViewPager
//position:当前要显示条目的位置
int newPosition = position%imageListView.size();
ImageView imageView =imageListView.get(newPosition);
//a.把View对象添加到container中
container.addView(imageView);
//b.把View对象返回给框架(适配器)
return imageView;//必需重写,否则报异常
}
/**
*2.销毁条目
* @param container
* @param position
* @param object 要销毁的对象
*/
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
System.out.println("destroyItem销毁: "+position);
container.removeView((View) object);
}
//3.指定复用的判断逻辑,固定写法
@Override
public boolean isViewFromObject(View view, Object object) {
//当滑到新的条目时,又返回来 ,view是否可以被复用
//返回判断规则
return view==object;
}
}
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
//滚动时调用
}
@Override
public void onPageSelected(int position) {
//新的条目被选中时调用
System.out.println("onPageSelected: " + position);
int newPosition = position%imageListView.size();
tv_desc.setText(contentDesc[newPosition]);
// for (int i = 0; i < ll_point_contaniner.getChildCount(); i++) {
// ll_point_contaniner.getChildAt(position).setEnabled(position==i);
// }
//把之前的禁用,把最新的启用,更新指示器
// (顺序不能调换,因为第一个显示的priviousSelectedPosition==newPosition==0,调换后,第一个显示的点将被禁掉)
ll_point_contaniner.getChildAt(priviousSelectedPosition).setEnabled(false);//之前的禁用
ll_point_contaniner.getChildAt(newPosition).setEnabled(true);//最新的(现在的)启用
priviousSelectedPosition = newPosition;//记录之前的位置
}
@Override
public void onPageScrollStateChanged(int state) {
//滚动状态变化时调用
}
}
activity_main.xml: <?xml version="1.0" encoding="utf-8"?> <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" tools:context="zkx.com.viewpager.MainActivity"> <RelativeLayout android:layout_width="match_parent" android:layout_height="160dp"> <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent"/> <LinearLayout android:layout_width="match_parent" android:layout_height="40dp" android:orientation="vertical" android:padding="5dp" android:background="#66000000" android:layout_alignParentBottom="true" android:gravity="center_horizontal"> <TextView android:id="@+id/tv_desc" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@android:color/white" android:singleLine="true" android:text="天王盖地虎,天王盖地虎,天王盖地虎"/> <LinearLayout android:id="@+id/ll_point_contaniner" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:orientation="horizontal"></LinearLayout> </LinearLayout> </RelativeLayout> </RelativeLayout>
以下三个xml文件建在drawable目录下
seletor_bg_point.xml: <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_enabled="true" android:drawable="@drawable/shape_bg_point_enable"/> <item android:state_enabled="false" android:drawable="@drawable/shape_bg_point_disable"/> </selector>
shape_bg_point_disable.xml: <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <corners android:radius="5dp"/> <solid android:color="@android:color/darker_gray"/> </shape>
shape_bg_point_enable.xml: <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <corners android:radius="5dp"/> <solid android:color="#FFFFFF"/> </shape>
轮播广告图需要用的图片资源可以在附件中下载,也可以用自己指定的图片