代码如下
MainActivity.java
package com.example.vp_demo2;
import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import com.example.vp_demo2.adapter.MyPagerAdapter;
import com.example.vp_demo2.bean.News;
public class MainActivity extends Activity {
ArrayList<News> newsList = new ArrayList<News>();
private static final int FIRST_PAGE = 1;
public static final int AUTO_SCROLL = 0;
private int currentPosition;
private LinearLayout ll_dots;
private ViewPager viewPager;
Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
if (msg.what == AUTO_SCROLL) {
// 获取当前viewPager所在索引值
int currentItem = viewPager.getCurrentItem();
// 让索引++
currentItem++;
// 重新设置给viewPager
viewPager.setCurrentItem(currentItem);
// 重新调用发送消息的方法
handler.sendEmptyMessageDelayed(AUTO_SCROLL, 2000);
}
};
};
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = (ViewPager) findViewById(R.id.viewPager);
ll_dots = (LinearLayout) findViewById(R.id.ll_dots);
// 初始化数据
initData();
// 初始化小点
initDots();
// 设置数据适配器
viewPager.setAdapter(new MyPagerAdapter(this, newsList,handler));
// 设置当前展示的位置为1 setCurrentItem 设置当前要轮播的viewpager
viewPager.setCurrentItem(FIRST_PAGE);
// 设置viewPager的监听事件
viewPager.setOnPageChangeListener(new OnPageChangeListener() {
// 滑动状态改变的方法 state :draaging 拖拽 idle 静止 settling 惯性过程
@Override
public void onPageScrollStateChanged(int state) {
// 如果是静止状态,将当前页进行替换
if (state == ViewPager.SCROLL_STATE_IDLE)
// 设置当前页,smoothScroll 平稳滑动
viewPager.setCurrentItem(currentPosition, false);
}
// 滑动过程中的方法 position 索引值
// positionOffset 0-1
// positionOffsetPixels 偏移像素值
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
}
// 选中某一页的监听
@Override
public void onPageSelected(int position) {
if (position == newsList.size() - 1) {
// 设置当前值为1
currentPosition = FIRST_PAGE;
} else if (position == 0) {
// 如果索引值为0了,就设置索引值为倒数第二个
currentPosition = newsList.size() - 2;
} else {
currentPosition = position;
}
// 设置小点监听
changeDots();
}
});
// 使用handler发送延时消息
handler.sendEmptyMessageDelayed(AUTO_SCROLL, 2000);
}
//
@Override
protected void onDestroy() {
super.onDestroy();
// 移除所有回调和消息
handler.removeCallbacksAndMessages(null);
}
private void changeDots() {
int dotPosition = currentPosition - 1;
// 设置小点监听
for (int i = 0; i < ll_dots.getChildCount(); i++) {
ImageView imageView = (ImageView) ll_dots.getChildAt(i);
if (i == dotPosition) {
// 从线性布局中取出对应小点,设置点亮
imageView.setImageResource(R.drawable.image_select);
} else {
imageView.setImageResource(R.drawable.image);
}
}
}
private void initDots() {
for (int i = 0; i < newsList.size() - 2; i++) {
// 实例化ImageView
ImageView imageView = new ImageView(this);
// 如果是第一页,设置为选中图片
if (i == 0) {
imageView.setImageResource(R.drawable.image_select);
} else {
imageView.setImageResource(R.drawable.image);
}
// 代码中设置大小是指相对像素---px
LayoutParams params = new LayoutParams(15, 15);
params.setMargins(5, 5, 5, 5);
// 添加到线性布局中
ll_dots.addView(imageView, params);
}
}
private void initData() {
newsList.add(new News("我是第四个美女", R.drawable.a3)); // 0
newsList.add(new News("我是第一个美女", R.drawable.a)); // 1
newsList.add(new News("我是第二个美女", R.drawable.a1)); // 2
newsList.add(new News("我是第三个美女", R.drawable.a2)); // 3
newsList.add(new News("我是第四个美女", R.drawable.a3)); // 4
newsList.add(new News("我是第一个美女", R.drawable.a)); // 5
}
}
-----------------------------------------------------------------------------------------
MyPagerAdapter.java 代码
package com.example.vp_demo2.adapter;
import java.util.ArrayList;
import android.content.Context;
import android.os.Handler;
import android.support.v4.view.PagerAdapter;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.vp_demo2.MainActivity;
import com.example.vp_demo2.R;
import com.example.vp_demo2.bean.News;
public class MyPagerAdapter extends PagerAdapter {
private final Context context;
private final ArrayList<News> newsList;
private final Handler handler;
//构造方法
public MyPagerAdapter(Context context, ArrayList<News> newsList,
Handler handler) {
this.handler = handler;
this.context = context;
this.newsList = newsList;
}
//统计循环的次数
@Override
public int getCount() {
return newsList.size();
}
//当前的视图是否和instantiateItem所返回key对应的view是否一致
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
//初始化布局方法
@Override
public Object instantiateItem(ViewGroup container, int position) {
// getView
View view = View.inflate(context, R.layout.vp_item, null);
ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
// 对ImageView设置触摸监听
imageView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()) {
// 按下
case MotionEvent.ACTION_DOWN:
// 取消handler任务
handler.removeCallbacksAndMessages(null);
break;
// case MotionEvent.ACTION_MOVE:
//
// break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
//重新执行handler轮播任务
handler.sendEmptyMessageDelayed(MainActivity.AUTO_SCROLL,
2000);
break;
default:
break;
}
// true 代表是消费该事件
// false 不消费
return true;
}
});
TextView tv_title = (TextView) view.findViewById(R.id.tv_title);
imageView.setImageResource(newsList.get(position).getResId());
tv_title.setText(newsList.get(position).getTitle());
// 添加到容器中
container.addView(view);
return view;
}
/**
* 销毁条目
* object 看instantiateItem中所返回的是不是view,如果是,可以直接移除object
*/
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
-----------------------------------------------------------------------------------------------------
News.java
package com.example.vp_demo2.bean;
public class News {
private String title;
private int resId;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getResId() {
return resId;
}
public void setResId(int resId) {
this.resId = resId;
}
public News(String title, int resId) {
super();
this.title = title;
this.resId = resId;
}
public News() {
super();
// TODO Auto-generated constructor stub
}
}
---------------------------------------------------------------------------------------------------------------------
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="match_parent" />
<LinearLayout
android:id="@+id/ll_dots"
android:gravity="center_horizontal"
android:layout_alignBottom="@id/viewPager"
android:orientation="horizontal"
android:layout_alignRight="@id/viewPager"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
</LinearLayout>
</RelativeLayout>
----------------------------------------------------------
vp_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_alignParentBottom="true"
android:layout_height="wrap_content" />
</RelativeLayout>
来源:oschina
链接:https://my.oschina.net/u/2663142/blog/3066710