Android 首次进入应用时加载引导界面
功能需求:首次进入应用时加载引导界面
思路:
1、首次进入,怎么判断?查看SharedPreferences中某个字段
2、基本上每个应用都有个进入实际功能是的动画加载页面,我们可以在该Activity中加入判断,看是否需要跳转到引导Activity
3、引导界面,采用现在比较主流的方式:左右滑动加载;小圆点提示;在最后一个页面,点击button,进入功能界面
实现功能:左右手势滑屏
底部小圆点随当前显示页跳动
浮动按钮显示。当触屏事件发生显示,否则就渐渐消失
第一种: ViewFlipper + GestureDetector
第二种: ActivityGroup + GestureDetector
第三种: ViewPager (Android3.0+)
第四种: ViewFlow (开源项目)
当你需要在一系列不确定数目的view中滑动时,可以考虑使用ViewFlow。如果你的view数目确定,你应该使用Fragments 或兼容库里的ViewPager 。
综合考虑代码复杂度以及以及加载的引导view个数可确定性,我们就采用第三种方案ViewPager。
(1)修改应用的动画加载页面SplashActivity.java
package com.example.guidepagetest2; import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message; /**
* 功能:使用ViewPager实现初次进入应用时的引导页
*
* (1)判断是否是首次加载应用--采取读取SharedPreferences的方法
* (2)是,则进入引导activity;否,则进入MainActivity
* (3)5s后执行(2)操作
*
* @author sz082093
*
*/
public class SplashActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash); boolean mFirst = isFirstEnter(SplashActivity.this,SplashActivity.this.getClass().getName());
if(mFirst)
mHandler.sendEmptyMessageDelayed(SWITCH_GUIDACTIVITY,);
else
mHandler.sendEmptyMessageDelayed(SWITCH_MAINACTIVITY,);
} //****************************************************************
// 判断应用是否初次加载,读取SharedPreferences中的guide_activity字段
//****************************************************************
private static final String SHAREDPREFERENCES_NAME = "my_pref";
private static final String KEY_GUIDE_ACTIVITY = "guide_activity";
private boolean isFirstEnter(Context context,String className){
if(context==null || className==null||"".equalsIgnoreCase(className))return false;
String mResultStr = context.getSharedPreferences(SHAREDPREFERENCES_NAME, Context.MODE_WORLD_READABLE)
.getString(KEY_GUIDE_ACTIVITY, "");//取得所有类名 如 com.my.MainActivity
if(mResultStr.equalsIgnoreCase("false"))
return false;
else
return true;
} //*************************************************
// Handler:跳转至不同页面
//*************************************************
private final static int SWITCH_MAINACTIVITY = ;
private final static int SWITCH_GUIDACTIVITY = ;
public Handler mHandler = new Handler(){
public void handleMessage(Message msg) {
switch(msg.what){
case SWITCH_MAINACTIVITY:
Intent mIntent = new Intent();
mIntent.setClass(SplashActivity.this, MainActivity.class);
SplashActivity.this.startActivity(mIntent);
SplashActivity.this.finish();
break;
case SWITCH_GUIDACTIVITY:
mIntent = new Intent();
mIntent.setClass(SplashActivity.this, GuideActivity.class);
SplashActivity.this.startActivity(mIntent);
SplashActivity.this.finish();
break;
}
super.handleMessage(msg);
}
};
(2)添加引导Activity的布局文件activity_guide.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"> <android.support.v4.view.ViewPager
android:id="@+id/guidePages"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
</LinearLayout> <LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"> <RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"> <LinearLayout
android:id="@+id/viewGroup"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="40dp"
android:gravity="center_horizontal"
android:orientation="horizontal"> </LinearLayout>
</RelativeLayout> </LinearLayout> </FrameLayout>
(3)添加引导时,左右滑动时的view,这里示例两个:
viewpager_page1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> <TextView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"
android:text="@string/guide_begin"
/> </LinearLayout>
viewpager_page2.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/guide_end"/>
<Button
android:id="@+id/btn_close_guide"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_close_guide"/> </LinearLayout>
(4)修改引导Activity:GuideActivity.java
package com.example.guidepagetest2; import java.util.ArrayList; import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.ImageView; public class GuideActivity extends Activity {
private ViewPager viewPager; /**装分页显示的view的数组*/
private ArrayList<View> pageViews;
private ImageView imageView; /**将小圆点的图片用数组表示*/
private ImageView[] imageViews; //包裹滑动图片的LinearLayout
private ViewGroup viewPics; //包裹小圆点的LinearLayout
private ViewGroup viewPoints; /** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); //将要分页显示的View装入数组中
LayoutInflater inflater = getLayoutInflater();
pageViews = new ArrayList<View>();
pageViews.add(inflater.inflate(R.layout.viewpager_page1, null));
pageViews.add(inflater.inflate(R.layout.viewpager_page2, null)); //创建imageviews数组,大小是要显示的图片的数量
imageViews = new ImageView[pageViews.size()];
//从指定的XML文件加载视图
viewPics = (ViewGroup) inflater.inflate(R.layout.activity_guide, null); //实例化小圆点的linearLayout和viewpager
viewPoints = (ViewGroup) viewPics.findViewById(R.id.viewGroup);
viewPager = (ViewPager) viewPics.findViewById(R.id.guidePages); //添加小圆点的图片
for(int i=;i<pageViews.size();i++){
imageView = new ImageView(GuideActivity.this);
//设置小圆点imageview的参数
imageView.setLayoutParams(new LayoutParams(,));//创建一个宽高均为20 的布局
imageView.setPadding(, , , );
//将小圆点layout添加到数组中
imageViews[i] = imageView; //默认选中的是第一张图片,此时第一个小圆点是选中状态,其他不是
if(i==){
imageViews[i].setBackgroundResource(R.drawable.page_indicator_focused);
}else{
imageViews[i].setBackgroundResource(R.drawable.page_indicator);
} //将imageviews添加到小圆点视图组
viewPoints.addView(imageViews[i]);
} //显示滑动图片的视图
setContentView(viewPics); //设置viewpager的适配器和监听事件
viewPager.setAdapter(new GuidePageAdapter());
viewPager.setOnPageChangeListener(new GuidePageChangeListener());
} private Button.OnClickListener Button_OnClickListener = new Button.OnClickListener() {
public void onClick(View v) {
//设置已经引导
setGuided(); //跳转
Intent mIntent = new Intent();
mIntent.setClass(GuideActivity.this, MainActivity.class);
GuideActivity.this.startActivity(mIntent);
GuideActivity.this.finish();
}
}; private static final String SHAREDPREFERENCES_NAME = "my_pref";
private static final String KEY_GUIDE_ACTIVITY = "guide_activity";
private void setGuided(){
SharedPreferences settings = getSharedPreferences(SHAREDPREFERENCES_NAME, );
SharedPreferences.Editor editor = settings.edit();
editor.putString(KEY_GUIDE_ACTIVITY, "false");
editor.commit();
} class GuidePageAdapter extends PagerAdapter{ //销毁position位置的界面
@Override
public void destroyItem(View v, int position, Object arg2) {
// TODO Auto-generated method stub
((ViewPager)v).removeView(pageViews.get(position)); } @Override
public void finishUpdate(View arg0) {
// TODO Auto-generated method stub } //获取当前窗体界面数
@Override
public int getCount() {
// TODO Auto-generated method stub
return pageViews.size();
} //初始化position位置的界面
@Override
public Object instantiateItem(View v, int position) {
// TODO Auto-generated method stub
((ViewPager) v).addView(pageViews.get(position)); // 测试页卡1内的按钮事件
if (position == ) {
Button btn = (Button) v.findViewById(R.id.btn_close_guide);
btn.setOnClickListener(Button_OnClickListener);
} return pageViews.get(position);
} // 判断是否由对象生成界面
@Override
public boolean isViewFromObject(View v, Object arg1) {
// TODO Auto-generated method stub
return v == arg1;
} @Override
public void startUpdate(View arg0) {
// TODO Auto-generated method stub } @Override
public int getItemPosition(Object object) {
// TODO Auto-generated method stub
return super.getItemPosition(object);
} @Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
// TODO Auto-generated method stub } @Override
public Parcelable saveState() {
// TODO Auto-generated method stub
return null;
}
} class GuidePageChangeListener implements OnPageChangeListener{ @Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub } @Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub } @Override
public void onPageSelected(int position) {
// TODO Auto-generated method stub
for(int i=;i<imageViews.length;i++){
imageViews[position].setBackgroundResource(R.drawable.page_indicator_focused);
//不是当前选中的page,其小圆点设置为未选中的状态
if(position !=i){
imageViews[i].setBackgroundResource(R.drawable.page_indicator);
}
} }
}
}
动画加载页面:

引导页面:


点击“关闭引导界面”或者非首次进入应用后的功能页面:

Android 首次进入应用时加载引导界面的更多相关文章
- 【Android】首次进入应用时加载引导界面
		
参考文章: [1]http://blog.csdn.net/wsscy2004/article/details/7611529 [2]http://www.androidlearner.net/and ...
 - Android开发中如何解决加载大图片时内存溢出的问题
		
Android开发中如何解决加载大图片时内存溢出的问题 在Android开发过程中,我们经常会遇到加载的图片过大导致内存溢出的问题,其实类似这样的问题已经屡见不鲜了,下面将一些好的解决方案分享给 ...
 - Android动画之仿美团加载数据等待时,小人奔跑进度动画对话框(附顺丰快递员奔跑效果)
		
Android动画之仿美团加载数据等待时,小人奔跑进度动画对话框(附顺丰快递员奔跑效果) 首句依然是那句老话,你懂得! finddreams :(http://blog.csdn.net/finddr ...
 - Android ListView只加载当前屏幕内的图片(解决list滑动时加载卡顿)
		
最近在做ListView分页显示,其中包括图片 和文字(先下载解析文字内容,再异步加载图片)发现每次点击下一页后,文字内容加载完毕,马上向下滑动,由于这时后台在用线程池异步下载图片,我每页有20条,也 ...
 - 嵌入式linux加载引导内核和根文件系统的方法
		
总体来说,嵌入式Linux内核和根文件的引导与PC机差不多.嵌入式linux内核和根文件系统可以存放在各种可能的存储设备中,一般情况下我 们将内核和根文件系统直接烧入到Flash中(包括NOR和NAN ...
 - Xamarin  Android Fragment的两种加载方式
		
android Fragment的重点: 3.0版本后引入,即minSdk要大于11 Fragment需要嵌套在Activity中使用,当然也可以嵌套到另外一个Fragment中,但这个被嵌套的Fra ...
 - 移动web、webApp、混合APP、原生APP、androd H5混合开发 当无网络下,android怎么加载H5界面
		
PhoneGap是一个采用HTML,CSS和JavaScript的技术,创建移动跨平台移动应用程序的快速开发平台.它使开发者能够在网页中调用IOS,Android,Palm,Symbian,WP7,W ...
 - (转)Android技术积累:图片异步加载
		
当在ListView或GridView中要加载很多图片时,很容易出现滑动时的卡顿现象,以及出现OOM导致FC(Force Close). 会出现卡顿现象主要是因为加载数据慢,要等数据加载完才能显示出来 ...
 - Android笔记之使用Glide加载网络图片、下载图片
		
Glide简介 不想说太多,真的很方便:P)可以节省我不少时间 GitHub地址:https://github.com/bumptech/glide 加载网络图片到ImageView Glide.wi ...
 
随机推荐
- HDU--杭电--1253--胜利大逃亡--广搜
			
胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
 - [PWA] 18. Clean the photo cache
			
We cannot let photo always keep caching new data without clean the old data. If message is not displ ...
 - qt 关于内存泄漏的检测
			
Qt 关于内存泄露的检测: 收藏人:guitarhua 2012-02-10 | 阅: 转: | 来源 | 分享 Qt 关于内存泄露的检测:工具篇 ...
 - android studio上代码编译调试中遇到的一些异常记录
			
下面是记录的在平时代码编写或编译时的一些异常,答案有自己摸索出来的,也有参考其他程序猿朋友的,参考文章过多,就不一一贴出来了. ① E/JavaBinder: !!! FAILED BINDER TR ...
 - BestCoder 1st Anniversary
			
Souvenir Accepts: 1078 Submissions: 2366 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 26 ...
 - bootstrap datetimepicker 时间段选择限制
			
<!DOCTYPE html> <html> <head> <title></title> <link href="./bo ...
 - Python的基本配置
			
Python是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结 ...
 - php输出金字塔
			
<?php for($i=0;$i<10;$i++){ for($j=1;$j<=$i;$j++){ echo $i.'*'.$j.'|'; } echo '<br>'; ...
 - Sublime Text 2 自动开启换行 Word Wrap
			
首先当然要夸一下神器 Sublime Text 2,自从第一次用我就彻底把神马 Notepad++ 和 TextMate 打入冷宫,用来开发 WEB 项目从此 IDE 都不需要了! 下面讲讲如何自动开 ...
 - 17个提升iOS开发效率的必用工具
			
时间就是金钱.编码效率的提升意味着更多的收入.可是当我们的开发技巧已经到达一定高度时,如何让开发效率更上一层楼呢?答案就是使用开发工具!在这篇文章中,我会向你介绍一些帮助我们提升编码速度和工作效率的工 ...