Android之ViewPager
最近公司做了一个小项目,主要是用来橱窗展示图片轮播的一个广告小程序,要实现图片自动切换,于是我第一时间就想到了用viewpager来实现
第一步:首先创建布局文件
<LinearLayout 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/vp"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</android.support.v4.view.ViewPager>
</LinearLayout>
注意:由于ViewPager是单独封装的,所以在使用之前要导入android-support-v4.jar包
第二步:在activity中使用ViewPager,并添加适配器,配置要显示的图片,图片可以是sd卡上的,也可以是项目中资源文件目录的
package com.jiao.viewpager;
import java.util.ArrayList;
import java.util.Timer;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
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.TextView;
public class MainActivity extends Activity {
private int imageIDs[];
private String titles[];
private ArrayList<ImageView> images;
private TextView title;
private ViewPager viewPager;
private ViewPagerAdapter adapter;
private int oldPosition = 0;//上一次的页面位置
private int currentItem = 0;// 当前页面
private ScheduledExecutorService executor;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//图片ID集合
imageIDs = new int[]{
R.drawable.a,
R.drawable.b,
R.drawable.c,
R.drawable.d,
R.drawable.e
};
//图片的标题
titles = new String[]{
"图片1",
"图片2",
"图片3",
"图片4",
"图片5"
};
//显示的图片
images = new ArrayList<ImageView>();
for(int i = 0; i < imageIDs.length; i++){
ImageView imageView = new ImageView(this);
imageView.setBackgroundResource(imageIDs[i]);
images.add(imageView);
}
title = (TextView) findViewById(R.id.title);
title.setText(titles[0]);//默认页面显示的文字
viewPager = (ViewPager) findViewById(R.id.vp);
adapter = new ViewPagerAdapter();
viewPager.setAdapter(adapter);
viewPager.setOnPageChangeListener(new OnPageChangeListener() {//页面滑动监听器
@Override
public void onPageSelected(int position) {//滑动过来的页面显示完成时 执行该方法
// TODO Auto-generated method stub
title.setText(titles[position]);//设置为当前的标题
oldPosition = position;//把旧标号付给当前图片 就是上一次页面的位置
currentItem = position;//当前页面
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {//页面滑动(过程中)的时候执行
// TODO Auto-generated method stub
}
@Override
public void onPageScrollStateChanged(int arg0) {//页面当前状态 滑动或者停止滑动时执行
// TODO Auto-generated method stub
}
});
}
private class ViewPagerAdapter extends PagerAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
return images.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {//判断两张图片是否一致
// TODO Auto-generated method stub
return arg0 == arg1;
}
@Override
public Object instantiateItem(ViewGroup view, int position) {//向适配器返回要显示的图片
// TODO Auto-generated method stub
view.addView(images.get(position));
return images.get(position);
}
@Override
public void destroyItem(ViewGroup view, int position, Object object) {//销毁要显示的图片
// TODO Auto-generated method stub
view.removeView(images.get(position));
// super.destroyItem(view, position, object);
}
}
@Override
protected void onStart() {//activity运行后 自动执行该方法
// TODO Auto-generated method stub
super.onStart();
executor = Executors.newSingleThreadScheduledExecutor();//获取ThreadScheduledExecutor
// 每隔2秒钟 切换一张图片
executor.scheduleWithFixedDelay(new ViewpagerTask(), 2, 2, TimeUnit.SECONDS);
//第一个参数:要自动执行的方法(任务)
//第二个参数:延迟几秒启动
//第三个参数:之后每隔几秒 执行一次第一个参数的方法呢
//第四个参数:时间单位 时 分 秒
}
private class ViewpagerTask implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
//切换图片
currentItem = (currentItem + 1) % images.size();//很神奇的语法 切换图片
// handler.sendEmptyMessage(0);
handler.obtainMessage().sendToTarget();//获取当前消息 发送给handler
}
}
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
viewPager.setCurrentItem(currentItem);
}
};
@Override
protected void onStop() {//activity退出时执行该方法
// TODO Auto-generated method stub
super.onStop();
executor.shutdown();//销毁
}
}
注意:以上就是将资源文件拷贝到项目的res资源目录中,然后显示资源目录中的图片,同时使用了定时任务,使程序每2秒就执行一次,实现自动切换

浙公网安备 33010602011771号