最近公司做了一个小项目,主要是用来橱窗展示图片轮播的一个广告小程序,要实现图片自动切换,于是我第一时间就想到了用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秒就执行一次,实现自动切换