Android如何实现引导页

首先需要添加三个后台文件

SplashActivity(判断是否是第一次登陆)

WelcomeActivity(引导页)

ViewPagerAdapter(ViewPager控件适配器)

ViewPager是一种通过添加视图来实现左右滑动的控件,非常适合用来做引导页。

在应用第一次开启时,首先进入SplashActivity页面,通过SharePreferences存储判断登陆的布尔类型值判断用户是否是第一次打开应用,若是,跳转至引导页,否则直接跳到登陆页面。

在引导页面,使用ViewPager的addView(View v)方法添加多个视图,并且添加OnPageChangeListener监听器来监听用户的手势滑动,通过指定方法获取视图索引,从而实现视图切换。

话不多说,直接上代码:

SplashActivity

public class SplashActivity extends Activity {

private Context context;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);

context=SplashActivity.this;

boolean isFirstOpen=SharePerferenceUtil.IsFirstLogin(context);

if(!isFirstOpen){//不是第一次登陆

Intent intent=new Intent(context,LoginActivity.class);

startActivity(intent);

finish();

return;

}

setContentView(R.layout.activity_splash);

new Handler().postDelayed(new Runnable() {//第一次登陆时1秒后跳到引导页

@Override

public void run() {

Intent intent=new Intent(context,WelcomeActivity.class);

startActivity(intent);

finish();

overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);

}

}, 1000);

}

}

ViewPagerAdapter

public class ViewPagerAdapter extends PagerAdapter {

private List views;

public ViewPagerAdapter(List views2){

this.views=views2;

}

//获得视图总数

@Override

public int getCount() {

if(views!=null){

return views.size();

}

return 0;

}

//判断是否由对象生成视图

@Override

public boolean isViewFromObject(View arg0, Object arg1) {

return (arg0==arg1);

}

//初始化position位置的视图

@Override

public Object instantiateItem(View container, int position) {

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

return views.get(position);

}

//销毁position位置的视图

@Override

public void destroyItem(View container, int position, Object object) {

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

}

}

WelcomeActivity

public class WelcomeActivity extends Activity implements OnClickListener,OnPageChangeListener{

private ViewPager viewPager;

private LinearLayout pointLayout;

private ViewPagerAdapter adapter;

private List views;

private Button startBtn;

private int[] guidePics = { R.layout.view_guide1, R.layout.view_guide2,

R.layout.view_guide3 };//引导页中的三张图片布局

private ImageView[] dots;//代表视图索引的圆圈

private int currentIndex;//表示前一个视图的索引

private Context context;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.activity_welcome);

context = WelcomeActivity.this;

if (Build.VERSION.SDK_INT >= 19) {// android 4.4 以上 沉浸式状态栏

Window window = getWindow();

window.addFlags(67108864);

}

AndroidBug5497Workaround.assistActivity(WelcomeActivity.this);//解决沉浸式bug

viewPager = (ViewPager) findViewById(R.id.viewPager);

pointLayout=(LinearLayout) findViewById(R.id.pointLayout);

views = new ArrayList();

initGuidePage();

setViewPagerAdapter();

initDots();

}

@Override

protected void onPause() {

super.onPause();

// 如果切换到后台,就设置下次不进入功能引导页

// SharePerferenceUtil.setFirstLogin(context, false);

}

//初始化引导页视图

private void initGuidePage() {

for (int i = 0; i < guidePics.length; i++) {

View view=LayoutInflater.from(context).inflate(guidePics[i], null);

if(i==guidePics.length-1){

startBtn=(Button) view.findViewById(R.id.btnStart);

startBtn.setTag("start");

startBtn.setOnClickListener(this);

}

views.add(view);

}

}

//设置ViewPager适配器

private void setViewPagerAdapter() {

adapter=new ViewPagerAdapter(views);

viewPager.setAdapter(adapter);

viewPager.setOnPageChangeListener(this);

}

//初始化圆圈

private void initDots() {

dots=new ImageView[guidePics.length];

for (int i = 0; i < guidePics.length; i++) {

dots[i]=(ImageView) pointLayout.getChildAt(i);

dots[i].setEnabled(true);

dots[i].setOnClickListener(this);

dots[i].setTag(i);

}

currentIndex=0;

dots[currentIndex].setEnabled(false);

}

@Override

public void onClick(View v) {

if(v.getTag().equals("start")){

enterToLoginActivity();//点击“立即开启” 进入登陆页面

return;

}

//圆圈点击后执行

int position=(Integer) v.getTag();

setCurrentView(position);

setCurrentDot(position);

}

//设置当前视图

private void setCurrentView(int position) {

if(position<0||position>guidePics.length-1){

return;

}

viewPager.setCurrentItem(position);

}

//设置当前圆圈状态

private void setCurrentDot(int position) {

if(position<0||position>guidePics.length-1||currentIndex==position){

return;

}

dots[position].setEnabled(false);

dots[currentIndex].setEnabled(true);

currentIndex=position;

}

//通过SplashActivity中转进入LoginActivity

private void enterToLoginActivity() {

Intent intent=new Intent(context,SplashActivity.class);

startActivity(intent);

SharePerferenceUtil.setFirstLogin(context, false);//设置不是第一次登陆

finish();

overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);

}

@Override

public void onPageScrollStateChanged(int arg0) {

// arg0 ==1的时辰默示正在滑动,arg0==2的时辰默示滑动完毕了,arg0==0的时辰默示什么都没做。

}

@Override

public void onPageScrolled(int arg0, float arg1, int arg2) {

// arg0 :当前页面,及你点击滑动的页面

    // arg1:当前页面偏移的百分比

    // arg2:当前页面偏移的像素位置

}

@Override

public void onPageSelected(int position) {

setCurrentDot(position);//设置圆圈状态

}

}

引导页布局文件

< RelativeLayout 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/viewPager"

    android:layout_width="match_parent"

    android:layout_height="match_parent"/ >

  < LinearLayout

    android:id="@+id/pointLayout"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

    android:layout_alignParentBottom="true"

android:layout_centerHorizontal="true"

    android:layout_marginBottom="40dp"

    android:orientation="horizontal"> 

底部的三个小圆圈

    < ImageView

      android:layout_width="wrap_content"

      android:layout_height="wrap_content"

      android:layout_gravity="center_vertical"

      android:clickable="true"

      android:padding="15dp"

      android:src="@drawable/point_bg"/ >

    < ImageView

      android:layout_width="wrap_content"

      android:layout_height="wrap_content"

      android:layout_gravity="center_vertical"

      android:clickable="true"

      android:padding="15dp"

      android:src="@drawable/point_bg"/ >

    < ImageView

      android:layout_width="wrap_content"

      android:layout_height="wrap_content"

      android:layout_gravity="center_vertical"

      android:clickable="true"

      android:padding="15dp"

      android:src="@drawable/point_bg"/ >

  < /LinearLayout>

< /RelativeLayout>

引导页视图(三个),这里仅贴出最后一个视图布局

< RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

 android:layout_width="match_parent"

  android:layout_height="match_parent" 

>

  < ImageView

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:src="@drawable/guide_3"

    android:scaleType="fitXY" 

/ >

  < Button

    android:id="@+id/btnStart"

    android:layout_width="200dp"

    android:layout_height="50dp"

    android:text="立即开启"

    android:textColor="@color/orange_express"

    android:layout_centerHorizontal="true"

    android:layout_alignParentBottom="true"

    android:layout_marginBottom="150dp"

    android:background="@drawable/startbtn_bg"/>

< /RelativeLayout>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容