您的位置:首页 > 其它

引导页

2015-09-09 11:31 211 查看
这是参考网上别人的代码做的一个引导页,大致过程如下

1,应用启动时进入启动页,判断SharedPreferences中是否存有标记字段,若没有进入第2步并存入标记(可设置短暂延迟),若有则进入第3步;

2,启动引导页,展示引导内容,点击最后一页上的进入应用按钮进入第3步;

3,进入应用主界面;

启动页:

public class WelcomeActivity extends Activity {
	
	private boolean isFirstIn = false;
	private static final int TIME = 1000;//在启动页停留的时间(毫秒)
	private static final int GO_HOME = 1000;
	private static final int GO_GUIDE = 1001;
	//用Handler实现延迟的效果
	private Handler handler = new Handler(){
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case GO_HOME:
				goHome();//进入主界面
				break;

			case GO_GUIDE:
				 goGuide();//进入引导页
				break;
			}
			
		};
	};
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_welcome);
		init();
	}
	/**通过查询存储的标记判断是进入主页或引导页*/
	private void init(){
		SharedPreferences perPreferences = getSharedPreferences("dudu", MODE_PRIVATE);
		isFirstIn = perPreferences.getBoolean("isFirstIn", true);//第一次取到默认值true
		if (!isFirstIn) {
			handler.sendEmptyMessageDelayed(GO_HOME, TIME);//延迟TIME秒发送
		}else{
			//存入标记,只初次进入时执行一次
			//一旦进入引导页,无论是否滑动到最后一页,下次都不再进入
			handler.sendEmptyMessageDelayed(GO_GUIDE, TIME);//延迟TIME秒发送
			Editor editor = perPreferences.edit();
			editor.putBoolean("isFirstIn", false);
			editor.commit();
		}
		
	}
	/**进入主界面*/
	private void goHome(){
		Intent i = new Intent(this,MainActivity.class);
		startActivity(i);
		finish();
	}
	/**进入引导页*/
	private void goGuide(){
		Intent i = new Intent(this,Guide.class);
		startActivity(i);
		finish();
	}
}


引导页:

public class Guide extends Activity implements OnPageChangeListener {

	private ViewPager viewPager;
	private ViewPagerAdapter viewPagerAdapter;
	private List<View> views;
	private ImageView[] dots;//引导页上的n个圆点
	private int[] ids = { R.id.iv1, R.id.iv2, R.id.iv3 };//引导页上作为n个圆点的ImageView的id
	private Button btn_start;//引导页最后一页的进入应用按钮
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_guide);
		initViews();
		initDots();
	}
	/**初始化引导页的ViewPager*/
	private void initViews() {
		LayoutInflater inflater = LayoutInflater.from(this);

		views = new ArrayList<View>();
		views.add(inflater.inflate(R.layout.one, null));
		views.add(inflater.inflate(R.layout.two, null));
		views.add(inflater.inflate(R.layout.three, null));

		viewPagerAdapter = new ViewPagerAdapter(views);
		viewPager = (ViewPager) findViewById(R.id.viewpager);
		viewPager.setAdapter(viewPagerAdapter);
		viewPager.setOnPageChangeListener(this);
		//引导页最后一页的进入应用按钮
		btn_start = (Button) views.get(2).findViewById(R.id.btn_start);
		btn_start.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				Intent i = new Intent(Guide.this, MainActivity.class);
				startActivity(i);
				finish();
			}
		});
		
	}
	/**初始引导页上的化圆点*/
	private void initDots() {
		dots = new ImageView[views.size()];
		for (int i = 0; i < views.size(); i++) {
			dots[i] = (ImageView) findViewById(ids[i]);
		}
	}

	@Override
	//此方法是在状态改变的时候调用,其中arg0这个参数有三种状态(0,1,2)。arg0 ==1的时辰默示正在滑动,
	//arg0==2的时辰默示滑动完毕了,arg0==0的时辰默示什么都没做。
	public void onPageScrollStateChanged(int arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	//当页面在滑动的时候会调用此方法,在滑动被停止之前,此方法回一直得到调用。
	//其中三个参数的含义分别为:arg0 :当前页面,arg1:当前页面偏移的百分比,arg2:当前页面偏移的像素位置   
	public void onPageScrolled(int arg0, float arg1, int arg2) {
		// TODO Auto-generated method stub

	}

	@Override
	// 此方法是页面跳转完后得到调用,arg0是你当前页面的Position
	public void onPageSelected(int arg0) {
		//更新引导页上的圆点
		for (int i = 0; i < ids.length; i++) {
			if (arg0 == i) {
				dots[i].setImageResource(R.drawable.login_point_selected);
			} else {
				dots[i].setImageResource(R.drawable.login_point);
			}
		}
	}

	
}


引导页的内容适配器:

public class ViewPagerAdapter extends PagerAdapter {
	private List<View> views;

	public ViewPagerAdapter(List<View> views) {

		this.views = views;
	}

	// 实现一个PageAdapter的时候,至少必须要重载(override)下面4个方法:
	@Override
	// 在指定的位置创建页面;适配器负责添加view到这个容器中,然而它只保证在finishUpdate(ViewGroup)返回时才完成。
	public void destroyItem(View container, int position, Object object) {// 销毁条目

		((ViewPager) container).removeView(views.get(position));
	}

	@Override
	// 删除指定位置的页面;适配器负责从view容器中删除view,然而它只保证在finishUpdate(ViewGroup)返回时才完成。
	public Object instantiateItem(View container, int position) {// 实例化条目

		((ViewPager) container).addView(views.get(position));

		return views.get(position);

	}

	@Override
	// 返回可用的view的数量。
	public int getCount() {// 获取条目数量
		return views.size();
	}

	@Override
	// 判断页面是否跟指定的key对象关联,key对象由instantiateItem(ViewGroup, int)返回。
	public boolean isViewFromObject(View arg0, Object arg1) {
		return (arg0 == arg1);
	}
	/*
	 * PagerAdapter支持数据集(data set)的变更更新。
	 * 但数据集变更,必须发生在主线程中,并且最后要调用notifyDataSetChanged()方法,
	 * 这点与从BaseAdapter派生的AdapterView的适配器,很相似。 数据集的改变,可以包含pages的添加,删除或位置改变。
	 * ViewPager将保持当前的页面处于active状态,它由实现了getItemPosition(Object)方法的适配器提供。
	 * 
	 * 
	 * ViewPager都关联一个key对象,而不是直接与Views关联。 这个key用来跟踪并唯一标识指定的页面,它独立于其在适配器中的位置。
	 * 对PagerAdapter的startUpdate(ViewGroup)方法的一次调用,标志着ViewPager的页面内容即将改变。
	 * 随后,会调用若干次instantiateItem(ViewGroup, int) 或destroyItem(ViewGroup, int,
	 * Object), 最后,会调用 finishUpdate(ViewGroup),这意味着本次更新将要结束了。
	 * 等到finishUpdate返回时,与instantiateItem返回的key对象关联的view,应该被添加到其父控件ViewGroup中了,
	 * 而与传递给destroyItem 的这些key关联的view,应该被移除了。 isViewFromObject(View,
	 * Object)方法用于判断某个view是否与key对象关联。 一个简单的PagerAdapter,可以用page Views本身当为key对象;
	 * 创建并添加到ViewGroup中后,可以instantiateItem(ViewGroup, int)中返回它;
	 * 对应的destroyItem(ViewGroup, int, Object)的实现,从父控件ViewGroup中删除它;
	 * isViewFromObject(View, Object) 可以这样实现:return view == object;.
	 */

}
主页(此处为空白页):

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}


demo地址http://download.csdn.net/detail/duduhali/9091489
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: