viewpager的轮播实现需要
1、定时切换:每隔一定时间自动播放,也支持手动切换
2、无限播放:最后一张切到第一张重新播放
第一步:主界面布局
activity_main.xml
<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="200dp" />
<!-- layout_alignBottom与below 的区别:在布局《里》下面 和 在布局 下面
layout_alignBottom:与布局底部对齐
below在布局的下方
-->
<LinearLayout
android:id="@+id/layout_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/viewpager"
android:background="#33000000"
android:orientation="vertical">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" />
<!--//放置点的布局-->
<LinearLayout
android:id="@+id/layout_points"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal" />
</LinearLayout>
</RelativeLayout>
2、代码实现
package com.example.administrator.viewpagerdemo;
import android.os.Handler;
import android.os.SystemClock;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ViewPager viewpager;
private TextView textview;// 标题容器
private LinearLayout layout_points;// 标题和圆点布局
private String[] titles;// 标题资源
// 初始化数据源(内容为空),不然空指针异常
private List<ImageView> list = new ArrayList<ImageView>();
private int[] imgIds = {R.drawable.a, R.drawable.b, R.drawable.c,
R.drawable.d, R.drawable.e};// 图片资源
private int prePosition;// 标识前一个点的位置
private boolean isLoop = true;
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 0:
// 得到viewpage中当前的索引
int currentItem = viewpager.getCurrentItem();
viewpager.setCurrentItem(currentItem + 1);
break;
default:
break;
}
}
;
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewpager = (ViewPager) this.findViewById(R.id.viewpager);
textview = (TextView) this.findViewById(R.id.tv_title);
// 注意布局别找错了
layout_points = (LinearLayout) this.findViewById(R.id.layout_points);
titles = getResources().getStringArray(R.array.titleName); //来自value的数组值
// 初始化“点” ,List<Images>
for (int i = 0; i < imgIds.length; i++) {
ImageView imgview = new ImageView(this);
imgview.setBackgroundResource(imgIds[i]);
imgview.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
list.add(imgview);
// 实例化‘点’
View view = new View(this);
// 默认全部不选中(灰色)
view.setBackgroundResource(R.drawable.dot_normal);
// 定义宽和高参数
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
15, 15);
// 点与点之间有间隙
params.leftMargin = 5;
view.setLayoutParams(params);
// 存放到容器中
layout_points.addView(view);
}
// 设置第一页显示的标题
textview.setText(titles[0]);
// 设置第一页相应的圆点的选中状态
layout_points.getChildAt(0)
.setBackgroundResource(R.drawable.dot_focused);
MyPagerAdapter adapter = new MyPagerAdapter(list);
viewpager.setAdapter(adapter);
viewpager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override //页面切换调用
public void onPageSelected(int position) {
textview.setText(titles[position % list.size()]); //实现两头滑动步骤三
// 设置前一个点的背景图
layout_points.getChildAt(prePosition).setBackgroundResource(R.drawable.dot_normal);
// 当前位置的点被选中
layout_points.getChildAt(position % list.size()).setBackgroundResource(R.drawable.dot_focused);
// 准备前一个点的位置的值
prePosition = position % list.size(); //实现两头滑动步骤四
}
@Override //滚动偏移
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override //滑动状态改变调用
public void onPageScrollStateChanged(int arg0) {
}
});
// 开辟线程:定时器
new Thread(new Runnable() {
@Override
public void run() {
while (isLoop) {
SystemClock.sleep(3000);
// 通知主线程更新图片
handler.sendEmptyMessage(0);
}
}
}).start();
}
@Override
protected void onDestroy() {
super.onDestroy();
isLoop = false;
}
}
适配器
package com.example.administrator.viewpagerdemo;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import java.util.List;
/**
* Created by Administrator on 2017/6/13.
*/
public class MyPagerAdapter extends PagerAdapter {
private List<ImageView> list;
public MyPagerAdapter(List<ImageView> list) {
this.list = list;
}
@Override
public int getCount() {
// 实现两头无线滑动
return Integer.MAX_VALUE; //实现两头滑动步骤一
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public Object instantiateItem(ViewGroup container, int position) { //实现两头滑动步骤二
// position有可能无限大,所以要取模
View view = this.list.get(position % list.size());
container.addView(view);
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
View view = this.list.get(position % list.size()); //实现两头滑动步骤
container.removeView(view);
}
}
点的背景:
drawable/dot_focused.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<corners android:radius="5dip"/>
<solid android:color="#55000000"/>
</shape>
drawable/dot_normal.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<corners android:radius="5dip"/>
<solid android:color="#aaFFFFFF"/>
</shape>
values/arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="titleName">
<item>我是一个兵</item>
<item>列出安装的应用程序</item>
<item>把我们的应用程序作为home</item>
<item>通过PackageManager的api 查询已经安装的apk</item>
<item>监听GridView的onItemClick事件</item>
</string-array>
</resources>