导航

Android-引导页面实现

Posted on 2017-06-16 01:27  Young哥哥  阅读(94)  评论(0编辑  收藏  举报

现在的大多数应用都会有一个欢迎引导页面,

需求分析:
程序安装后第一次启动:
启动页-->功能引导页-->应用主页
以后启动:
启动页-->应用主页

实现原理:

用SharedPreferences实现。
创建一个boolean的变量,默认值为true。
当判断这个变量是true的时候,说明是第一次运行,就跳转到另一个引导页面。
引导页面跳转到最后一张图片时,点击某按钮发生跳转事件,回到MainActivity,此时把变量的值改成false。

引导图效果用ViewPager可以很轻松的实现。

1.布局文件

splash.xml:

 

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2.     xmlns:tools="http://schemas.android.com/tools"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent"
  5.     tools:context=".SplashActivity" >
  6.     <ImageView
  7.         android:layout_width="match_parent"
  8.         android:layout_height="match_parent"
  9.         android:adjustViewBounds="true"
  10.         android:background="@drawable/welcome_android"
  11.         android:scaleType="centerCrop" />
  12. </RelativeLayout>
复制代码


guide.xml:

 

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent"
  5.     android:orientation="vertical" >
  6.     <android.support.v4.view.ViewPager
  7.         android:id="@+id/viewpager"
  8.         android:layout_width="match_parent"
  9.         android:layout_height="match_parent" />
  10.     <LinearLayout
  11.         android:id="@+id/ll"
  12.         android:layout_width="wrap_content"
  13.         android:layout_height="wrap_content"
  14.         android:layout_alignParentBottom="true"
  15.         android:layout_centerHorizontal="true"
  16.         android:layout_marginBottom="24.0dp"
  17.         android:orientation="horizontal" >
  18.         <ImageView
  19.             android:layout_width="wrap_content"
  20.             android:layout_height="wrap_content"
  21.             android:layout_gravity="center_vertical"
  22.             android:clickable="true"
  23.             android:padding="15.0dip"
  24.             android:src="@drawable/dot" />
  25.         <ImageView
  26.             android:layout_width="wrap_content"
  27.             android:layout_height="wrap_content"
  28.             android:layout_gravity="center_vertical"
  29.             android:clickable="true"
  30.             android:padding="15.0dip"
  31.             android:src="@drawable/dot" />
  32.         <ImageView
  33.             android:layout_width="wrap_content"
  34.             android:layout_height="wrap_content"
  35.             android:layout_gravity="center_vertical"
  36.             android:clickable="true"
  37.             android:padding="15.0dip"
  38.             android:src="@drawable/dot" />
  39.         <ImageView
  40.             android:layout_width="wrap_content"
  41.             android:layout_height="wrap_content"
  42.             android:layout_gravity="center_vertical"
  43.             android:clickable="true"
  44.             android:padding="15.0dip"
  45.             android:src="@drawable/dot" />
  46.     </LinearLayout>
  47. </RelativeLayout>
复制代码


main_activity,.xml默认

what_new_one.xml、what_new_two.xml、what_new_three.xml(将图片名称改下就行了):



  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent" >
  5.     <ImageView
  6.         android:layout_width="match_parent"
  7.         android:layout_height="match_parent"
  8.         android:layout_centerInParent="true"
  9.         android:adjustViewBounds="false"
  10.         android:focusable="true"
  11.         android:scaleType="centerCrop"
  12.         android:background="@drawable/guide_350_01" />
  13. </RelativeLayout>
复制代码


what_new_four.xml:

 

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent" >
  5.     <ImageView
  6.         android:layout_width="match_parent"
  7.         android:layout_height="match_parent"
  8.         android:layout_centerInParent="true"
  9.         android:adjustViewBounds="false"
  10.         android:background="@drawable/guide_350_04"
  11.         android:focusable="true"
  12.         android:scaleType="centerCrop" />
  13.     <ImageView
  14.         android:id="@+id/iv_start_weibo"
  15.         android:layout_width="wrap_content"
  16.         android:layout_height="wrap_content"
  17.         android:layout_alignParentBottom="true"
  18.         android:layout_centerHorizontal="true"
  19.         android:layout_marginBottom="108dp"
  20.         android:background="@drawable/whats_new_start_btn"
  21.         android:focusable="true" />
  22. </RelativeLayout>
复制代码


MainActivity.java不变

SplashActivity.java:



  1. package cn.eoe.leigo.splash;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.content.SharedPreferences;
  5. import android.os.Bundle;
  6. import android.os.Handler;
  7. import android.os.Message;
  8. /**
  9. * @{# SplashActivity.java Create on 2013-5-2 下午9:10:01
  10. *     class desc: 启动画面 (1)判断是否是首次加载应用--采取读取SharedPreferences的方法
  11. *     (2)是,则进入GuideActivity;否,则进入MainActivity (3)3s后执行(2)操作
  12. *     <p>
  13. *     Copyright: Copyright(c) 2013
  14. *     </p>
  15. * @Version 1.0
  16. * @Author <a href="mailto:gaolei_xj@163.com">Leo</a>
  17. */
  18. public class SplashActivity extends Activity {
  19.     boolean isFirstIn = false;
  20.     private static final int GO_HOME = 1000;
  21.     private static final int GO_GUIDE = 1001;
  22.     // 延迟3秒
  23.     private static final long SPLASH_DELAY_MILLIS = 3000;
  24.     private static final String SHAREDPREFERENCES_NAME = "first_pref";
  25.     /**
  26.      * Handler:跳转到不同界面
  27.      */
  28.     private Handler mHandler = new Handler() {
  29.         @Override
  30.         public void handleMessage(Message msg) {
  31.             switch (msg.what) {
  32.             case GO_HOME:
  33.                 goHome();
  34.                 break;
  35.             case GO_GUIDE:
  36.                 goGuide();
  37.                 break;
  38.             }
  39.             super.handleMessage(msg);
  40.         }
  41.     };
  42.     @Override
  43.     protected void onCreate(Bundle savedInstanceState) {
  44.         super.onCreate(savedInstanceState);
  45.         setContentView(R.layout.splash);
  46.         init();
  47.     }
  48.     private void init() {
  49.         // 读取SharedPreferences中需要的数据
  50.         // 使用SharedPreferences来记录程序的使用次数
  51.         SharedPreferences preferences = getSharedPreferences(
  52.                 SHAREDPREFERENCES_NAME, MODE_PRIVATE);
  53.         // 取得相应的值,如果没有该值,说明还未写入,用true作为默认值
  54.         isFirstIn = preferences.getBoolean("isFirstIn", true);
  55.         // 判断程序与第几次运行,如果是第一次运行则跳转到引导界面,否则跳转到主界面
  56.         if (!isFirstIn) {
  57.             // 使用Handler的postDelayed方法,3秒后执行跳转到MainActivity
  58.             mHandler.sendEmptyMessageDelayed(GO_HOME, SPLASH_DELAY_MILLIS);
  59.         } else {
  60.             mHandler.sendEmptyMessageDelayed(GO_GUIDE, SPLASH_DELAY_MILLIS);
  61.         }
  62.     }
  63.     private void goHome() {
  64.         Intent intent = new Intent(SplashActivity.this, MainActivity.class);
  65.         SplashActivity.this.startActivity(intent);
  66.         SplashActivity.this.finish();
  67.     }
  68.     private void goGuide() {
  69.         Intent intent = new Intent(SplashActivity.this, GuideActivity.class);
  70.         SplashActivity.this.startActivity(intent);
  71.         SplashActivity.this.finish();
  72.     }
  73. }
复制代码


GuideActivity.java:

  

  1. package cn.eoe.leigo.splash;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import android.app.Activity;
  5. import android.os.Bundle;
  6. import android.support.v4.view.ViewPager;
  7. import android.support.v4.view.ViewPager.OnPageChangeListener;
  8. import android.view.LayoutInflater;
  9. import android.view.View;
  10. import android.widget.ImageView;
  11. import android.widget.LinearLayout;
  12. import cn.eoe.leigo.splash.adapter.ViewPagerAdapter;
  13. /**
  14. * @{# GuideActivity.java Create on 2013-5-2 下午10:59:08
  15. *     class desc: 引导界面
  16. *     <p>
  17. *     Copyright: Copyright(c) 2013
  18. *     </p>
  19. * @Version 1.0
  20. * @Author <a href="mailto:gaolei_xj@163.com">Leo</a>
  21. */
  22. public class GuideActivity extends Activity implements OnPageChangeListener {
  23.     private ViewPager vp;
  24.     private ViewPagerAdapter vpAdapter;
  25.     private List<View> views;
  26.     // 底部小点图片
  27.     private ImageView[] dots;
  28.     // 记录当前选中位置
  29.     private int currentIndex;
  30.     @Override
  31.     protected void onCreate(Bundle savedInstanceState) {
  32.         super.onCreate(savedInstanceState);
  33.         setContentView(R.layout.guide);
  34.         // 初始化页面
  35.         initViews();
  36.         // 初始化底部小点
  37.         initDots();
  38.     }
  39.     private void initViews() {
  40.         LayoutInflater inflater = LayoutInflater.from(this);
  41.         views = new ArrayList<View>();
  42.         // 初始化引导图片列表
  43.         views.add(inflater.inflate(R.layout.what_new_one, null));
  44.         views.add(inflater.inflate(R.layout.what_new_two, null));
  45.         views.add(inflater.inflate(R.layout.what_new_three, null));
  46.         views.add(inflater.inflate(R.layout.what_new_four, null));
  47.         // 初始化Adapter
  48.         vpAdapter = new ViewPagerAdapter(views, this);
  49.         vp = (ViewPager) findViewById(R.id.viewpager);
  50.         vp.setAdapter(vpAdapter);
  51.         // 绑定回调
  52.         vp.setOnPageChangeListener(this);
  53.     }
  54.     private void initDots() {
  55.         LinearLayout ll = (LinearLayout) findViewById(R.id.ll);
  56.         dots = new ImageView[views.size()];
  57.         // 循环取得小点图片
  58.         for (int i = 0; i < views.size(); i++) {
  59.             dots[i] = (ImageView) ll.getChildAt(i);
  60.             dots[i].setEnabled(true);// 都设为灰色
  61.         }
  62.         currentIndex = 0;
  63.         dots[currentIndex].setEnabled(false);// 设置为白色,即选中状态
  64.     }
  65.     private void setCurrentDot(int position) {
  66.         if (position < 0 || position > views.size() - 1
  67.                 || currentIndex == position) {
  68.             return;
  69.         }
  70.         dots[position].setEnabled(false);
  71.         dots[currentIndex].setEnabled(true);
  72.         currentIndex = position;
  73.     }
  74.     // 当滑动状态改变时调用
  75.     @Override
  76.     public void onPageScrollStateChanged(int arg0) {
  77.     }
  78.     // 当当前页面被滑动时调用
  79.     @Override
  80.     public void onPageScrolled(int arg0, float arg1, int arg2) {
  81.     }
  82.     // 当新的页面被选中时调用
  83.     @Override
  84.     public void onPageSelected(int arg0) {
  85.         // 设置底部小点选中状态
  86.         setCurrentDot(arg0);
  87.     }
  88. }
复制代码


ViewPagerAdapter.java:



  1. package cn.eoe.leigo.splash.adapter;
  2. import java.util.List;
  3. import android.app.Activity;
  4. import android.content.Context;
  5. import android.content.Intent;
  6. import android.content.SharedPreferences;
  7. import android.content.SharedPreferences.Editor;
  8. import android.os.Parcelable;
  9. import android.support.v4.view.PagerAdapter;
  10. import android.support.v4.view.ViewPager;
  11. import android.view.View;
  12. import android.view.View.OnClickListener;
  13. import android.widget.ImageView;
  14. import cn.eoe.leigo.splash.MainActivity;
  15. import cn.eoe.leigo.splash.R;
  16. /**
  17. * @{# ViewPagerAdapter.java Create on 2013-5-2 下午11:03:39
  18. *     class desc: 引导页面适配器
  19. *     <p>
  20. *     Copyright: Copyright(c) 2013
  21. *     </p>
  22. * @Version 1.0
  23. * @Author <a href="mailto:gaolei_xj@163.com">Leo</a>
  24. */
  25. public class ViewPagerAdapter extends PagerAdapter {
  26.     // 界面列表
  27.     private List<View> views;
  28.     private Activity activity;
  29.     private static final String SHAREDPREFERENCES_NAME = "first_pref";
  30.     public ViewPagerAdapter(List<View> views, Activity activity) {
  31.         this.views = views;
  32.         this.activity = activity;
  33.     }
  34.     // 销毁arg1位置的界面
  35.     @Override
  36.     public void destroyItem(View arg0, int arg1, Object arg2) {
  37.         ((ViewPager) arg0).removeView(views.get(arg1));
  38.     }
  39.     @Override
  40.     public void finishUpdate(View arg0) {
  41.     }
  42.     // 获得当前界面数
  43.     @Override
  44.     public int getCount() {
  45.         if (views != null) {
  46.             return views.size();
  47.         }
  48.         return 0;
  49.     }
  50.     // 初始化arg1位置的界面
  51.     @Override
  52.     public Object instantiateItem(View arg0, int arg1) {
  53.         ((ViewPager) arg0).addView(views.get(arg1), 0);
  54.         if (arg1 == views.size() - 1) {
  55.             ImageView mStartWeiboImageButton = (ImageView) arg0
  56.                     .findViewById(R.id.iv_start_weibo);
  57.             mStartWeiboImageButton.setOnClickListener(new OnClickListener() {
  58.                 @Override
  59.                 public void onClick(View v) {
  60.                     // 设置已经引导
  61.                     setGuided();
  62.                     goHome();
  63.                 }
  64.             });
  65.         }
  66.         return views.get(arg1);
  67.     }
  68.     private void goHome() {
  69.         // 跳转
  70.         Intent intent = new Intent(activity, MainActivity.class);
  71.         activity.startActivity(intent);
  72.         activity.finish();
  73.     }
  74.     /**
  75.      * 
  76.      * method desc:设置已经引导过了,下次启动不用再次引导
  77.      */
  78.     private void setGuided() {
  79.         SharedPreferences preferences = activity.getSharedPreferences(
  80.                 SHAREDPREFERENCES_NAME, Context.MODE_PRIVATE);
  81.         Editor editor = preferences.edit();
  82.         // 存入数据
  83.         editor.putBoolean("isFirstIn", false);
  84.         // 提交修改
  85.         editor.commit();
  86.     }
  87.     // 判断是否由对象生成界面
  88.     @Override
  89.     public boolean isViewFromObject(View arg0, Object arg1) {
  90.         return (arg0 == arg1);
  91.     }
  92.     @Override
  93.     public void restoreState(Parcelable arg0, ClassLoader arg1) {
  94.     }
  95.     @Override
  96.     public Parcelable saveState() {
  97.         return null;
  98.     }
  99.     @Override
  100.     public void startUpdate(View arg0) {
  101.     }
  102. }
复制代码