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秒就执行一次,实现自动切换

 

posted @ 2013-04-01 20:34  Android、Boy  阅读(932)  评论(1编辑  收藏  举报