转载请注明出处,谢谢http://blog.csdn.net/harryweasley/article/details/42079167

先说下思路:1.利用Preference存储数据,来记录是否是第一次打开软件

2.利用ViewPager实现几个图片之间的切换,在每一个图片下方用代码画圆圈,圆圈会跟着图片的改变而改变。

3.在最后一张图片。加入button点击事件。进入正式界面。

程序尽管非常easy,可是非常有用。

看下效果图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSGFycnlXZWFzbGV5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

我们会看到圆圈的点会依据图片改变而改变。

以下開始解说:

首先是activity_main.xml文件

<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"
tools:context=".MainActivity" > <android.support.v4.view.ViewPager
android:id="@+id/guide_viewPager"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@android:color/transparent" /> <LinearLayout
android:id="@+id/linearlayout"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_alignParentBottom="true"
android:gravity="center_horizontal"
android:orientation="horizontal" >
</LinearLayout> </RelativeLayout>

里面有一个viewPager控件和LinearLayout控件,当中LinearLayout是装小圆圈的

接下来是三个pager_layout1.xml。pager_layout2.xml。pager_layout3.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:gravity="center"
android:background="@drawable/guide1"
android:orientation="vertical" > </LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/guide2"
android:orientation="vertical" > </RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/guide3"
android:gravity="center"
android:orientation="vertical" > <Button
android:id="@+id/guide_enter"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_gravity="center_horizontal|bottom"
android:layout_marginBottom="0dp"
android:background="@android:color/transparent"
/> </FrameLayout>

我们能够看到前面两个layout就直接是个图片做背景。第三个我仅仅是加了一个透明的button。模仿以下的“马上进入”button。

(在这里,假设你有更好的方法,能够分享一下哈)

接下来是PreferenceUtil类,存储isShow的值

package com.example.guiddemo;

import android.content.Context;
import android.content.SharedPreferences; public class PreferenceUtil { /**
* 是否显示欢迎界面,true表示显示,false表示不显示
*/
public static final String SHOW_GUIDE = "showguide"; /**
* 保存到Preference
*/
public static void setBoolean(Context context, String key, boolean value) {
// 得到SharedPreferences
SharedPreferences preferences = context.getSharedPreferences(
"preference", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean(key, value);
editor.commit();
} /**
* 从Preference取出数据
*/
public static boolean getBoolean(Context context, String key) {
SharedPreferences preferences = context.getSharedPreferences(
"preference", Context.MODE_PRIVATE);
// 返回key值,key值默认值是false
return preferences.getBoolean(key, false); }
}

关于Preference存储和取出数据这些操作,我想我不用多说了吧。

主要功能都是在MainActivity里,我的代码里写了具体的凝视的

package com.example.guiddemo;

import java.util.ArrayList;
import java.util.List; import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView; public class MainActivity extends Activity { /**
* 是否显示引导界面
*/
boolean isShow = false;
/**
* ViewPager对象
*/
private ViewPager mViewPager;
/**
* 装载小圆圈的LinearLayout
*/
private LinearLayout indicatorLayout;
/**
* ViewPager的每个页面集合
*/
private List<View> views;
/**
* ViewPager以下的小圆圈
*/
private ImageView[] mImageViews;
/**
* PagerAdapter对象
*/
private MyPagerAdapter myPagerAdapter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 得到Preference存储的isShow数据
isShow = PreferenceUtil.getBoolean(this, PreferenceUtil.SHOW_GUIDE);
//isShow=false;调试的时候用的
if (isShow) {
initLog();
} else {
initView();
}
} /**
* 进入登录界面
*/
private void initLog() {
startActivity(new Intent(this, LogActivity.class));
finish();
} /**
* 进入引导界面
*/
private void initView() {
mViewPager = (ViewPager) findViewById(R.id.guide_viewPager);
indicatorLayout = (LinearLayout) findViewById(R.id.linearlayout);
LayoutInflater inflater = LayoutInflater.from(this);
views = new ArrayList<View>();
views.add(inflater.inflate(R.layout.pager_layout1, null));
views.add(inflater.inflate(R.layout.pager_layout2, null));
views.add(inflater.inflate(R.layout.pager_layout3, null));
myPagerAdapter = new MyPagerAdapter(this, views);
mImageViews = new ImageView[views.size()];
drawCircl();
mViewPager.setAdapter(myPagerAdapter);
mViewPager.setOnPageChangeListener(new GuidePageChangeListener());
} /**
* 画圆圈
*/
private void drawCircl() {
int num = views.size();
for (int i = 0; i < num; i++) {
//实例化每个mImageViews[i]
mImageViews[i] = new ImageView(this);
if (i == 0) {
// 默认选中第一张照片,所以将第一个小圆圈变为icon_carousel_02
mImageViews[i].setImageResource(R.drawable.icon_carousel_02);
} else {
mImageViews[i].setImageResource(R.drawable.icon_carousel_01);
}
// 给每个小圆圈都设置间隔
mImageViews[i].setPadding(7, 7, 7, 7);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.CENTER_VERTICAL;
// 让每个小圆圈都在LinearLayout的CENTER_VERTICAL(中间垂直)
indicatorLayout.addView(mImageViews[i], params);
} } /**
*
* @author Harry 页面改变监听事件
*/
private class GuidePageChangeListener implements OnPageChangeListener {
public void onPageScrollStateChanged(int arg0) {
} public void onPageScrolled(int arg0, float arg1, int arg2) {
} /**
* 页面有所改变。假设是当前页面,将小圆圈改为icon_carousel_02。其它页面则改为icon_carousel_01
*/
public void onPageSelected(int arg0) {
for (int i = 0; i < mImageViews.length; i++) {
if (arg0 != i) {
mImageViews[i]
.setImageResource(R.drawable.icon_carousel_01);
} else {
mImageViews[arg0]
.setImageResource(R.drawable.icon_carousel_02);
}
}
}
} class MyPagerAdapter extends PagerAdapter {
private List<View> mViews;
private Activity mContext; public MyPagerAdapter(Activity context, List<View> views) {
this.mViews = views;
this.mContext = context;
} @Override
public int getCount() {
return mViews.size();
} @Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
} @Override
public int getItemPosition(Object object) {
return super.getItemPosition(object);
} @Override
public void destroyItem(View arg0, int arg1, Object arg2) {
((ViewPager) arg0).removeView(mViews.get(arg1));
} /**
* 实例化页卡,假设变为最后一页。则获取它的button而且加入点击事件
*/
@Override
public Object instantiateItem(View arg0, int arg1) {
((ViewPager) arg0).addView(mViews.get(arg1), 0);
if (arg1 == mViews.size() - 1) {
TextView enterBtn = (TextView) arg0
.findViewById(R.id.guide_enter);
enterBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 将isShow保存为true,并进入登录界面
PreferenceUtil.setBoolean(mContext,
PreferenceUtil.SHOW_GUIDE, true);
initLog();
}
});
}
return mViews.get(arg1);
}
} }

主要代码我就写完了。尽管比較简单。可是却非常有用,希望帮助到大家。

关于ViewPager相关知识,大家能够看这个博客,该博主讲的非常具体

http://blog.csdn.net/wangjinyu501/article/details/8169924

我的demo下载地址:

http://download.csdn.net/detail/harryweasley/8278633

版权声明:本文博主原创文章,博客,未经同意不得转载。

Android第一次打开应用程序,实现向导界面的更多相关文章

  1. Android开发实战之ViewPager实现向导界面

    当我们更新应用,或者第一次进入应用时都会有一个向导界面,介绍这个app的内容和使用方式. 如果你细心你会发现其实这就是个viewpager,本篇博文将介绍应用的向导界面是如何制作的.希 望本篇博文对你 ...

  2. Android小项目之十一 应用程序的主界面

    ------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 按惯例,写在前面的:可能在学习Android的过程中,大家会和我一样,学习过大量的基础知识,很多的知识点 ...

  3. android 程序打开第三方程序

    因为在开发过程中需要开启扫描第三方程序,并且点击启动的效果,所以对这个功能进行了实现,并且分享出来个大家. 之前看到网上说需要获取包名和类名,然后通过  intent 才能打开这个程序,其实不必要这样 ...

  4. 【转】Android 当打开“开发者模式”中的“不保留活动”后,程序应当怎么保持正常运行

    当打开这个设置以后,程序的Activity会自动销毁,每次返回的时候就会不断重oncreate,此时伴随的问题多多. 参考文档:http://www.bubuko.com/infodetail-960 ...

  5. Android -- 分享功能和打开指定程序

    打开指定程序                                                                                Intent intent ...

  6. Android 当打开“开发人员模式”中的“不保留活动”后,程序应当怎么保持正常执行

    Android 当打开"开发人员模式"中的"不保留活动"后,程序应当怎么保持正常执行咧. .? 在这几天,我一直在纠结这个问题.从发现,程序出现这个问题,是由于 ...

  7. excel第一次打开报错 向程序发送命令时出错 多种解决办法含终极解决方法

    excel第一次打开报错 向程序发送命令时出错 多种解决办法含终极解决方法 office2007应该遇到“向程序发送命令时出现 问题”,设置为以管理员运行也不好用,重装office也不好用,下面介绍下 ...

  8. Android 打开其他程序

    Intent intent = new Intent(); intent.setComponent(new ComponentName("所要打开的程序包名", "所要打 ...

  9. Android更改桌面应用程序launcher的两种方式

    http://blog.csdn.net/mdx20072419/article/details/9632779/ launcher,也就是android的桌面应用程序.下图是我正在使用的魅族手机的l ...

随机推荐

  1. 长方柱类【C++ 类定义】

    Description 编写基于对象的程序,求长方柱(Bulk)的体积.数据成员包括长(length).宽(width).高(heigth).体积,要求用成员函数实现下面的功能: (1)由键盘输入长方 ...

  2. UVALive 5103 Computer Virus on Planet Pandora Description 一些新兴需求模式的字符串 AC自己主动机

    主题链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=3104">点击打开链接 题意: ...

  3. perl操作sqlserver实现BCP

    #!C:\Perl64\bin #由BCP备份和恢复SQLSERVER指定表 use 5.014; #加载用户和password型材 my $username ; my $passwd; ##得到us ...

  4. [Android]Can&#39;t create handler inside thread that has not called Looper.prepare()

    更新是由于在新的线程来打开UI只有一个错误.子线程更新主线程UI需要使用Handler. 还有比如今天出现以下错误.码,如以下: send.setOnClickListener(new OnClick ...

  5. decimal ? 含义

    例如:   decimal ? je = zfje;   意思是  将 JE赋值为  ZFJE ,  并且允许  JE 为 NULL 值 这时JE为引用类型

  6. 【Android进阶】自定义控件实现底部扇形展开菜单效果

    这个项目是优化的其他人的,主要优化了界面菜单的显示,下面开始. 先看效果图 项目的总结构 下面开始贴代码,由于必要的地方都添加了注释,所以不过多讲解 anim_button.xml <?xml ...

  7. vpdn详细说明

     VPDN英文为Virtual Private Dial-up Networks,又称为虚拟专用拨号网,是VPN业务的一种,是基于拨号用户的虚拟专用拨号网业务. 中文名 虚拟专用拨号网业务 外文名 ...

  8. sizeof运营商

    sizeof它是C语言的关键字,它计算对象所占用的字节数.采用sizeof通过计算对象的大小,占用的对象是一个良好的编程习惯二手. ★你得到的内置型尺寸 一些内置类型的大小会随着体系结构的不同而不同, ...

  9. Linux课程_系统配置和日常维护

    1.设置命令输入提示格公式:"username:当前文件夹$" 2.设置命令输入提示行格式为:"当前系统时间-用户#"(提示:Shell将通过反引號" ...

  10. 玩转Web之Jsp(一)-----jsp中的静态包含(<%@include file="url"%>)与动态包含(<jsp:include>)

    在jsp中include有两种形式,其中<%@include file="url"%>是指令元素,<jsp:include page="" f ...