RxJava两步打造华丽的Android引导页
短信预约 -IT技能 免费直播动态提醒
前言
之前的一篇文章:基于RxJava实现酷炫启动页 中,我们尝试了用RxJava实现酷炫的启动页,今天我们在此基础上加入首次使用APP时的引导页功能。
效果如下图:
思路:思路其实很简单,就是在
WelcomeActivity
中setContentView()
之前判断是否是首次打开APP,若是,则去启动引导页(WelcomeGuideActivity)
并return;若不是,则直接setContentView(),
然后启动动画再启动MainActivity
。
一、WelcomeActivity中判断是否是第一次启动
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 判断是否是第一次开启应用
boolean isFirstOpen = SharedPreferencesUtil.getBoolean(this, SharedPreferencesUtil.FIRST_OPEN, true);
// 如果是第一次启动,则先进入功能引导页
if (isFirstOpen) {
Intent intent = new Intent(this, WelcomeGuideActivity.class);
startActivity(intent);
finish();
return;
}
// 如果不是第一次启动app,则正常显示启动屏
setContentView(R.layout.activity_welcome);
ButterKnife.bind(this);
startMainActivity();
}
我们判断是否是第一次打开APP是用了
SharedPreferences
,我们这里对他进行了一下简单封装,代码如下:
public class SharedPreferencesUtil {
private static final String spFileName = "welcomePage";
public static final String FIRST_OPEN = "first_open";
public static Boolean getBoolean(Context context, String strKey,
Boolean strDefault) {//strDefault boolean: Value to return if this preference does not exist.
SharedPreferences setPreferences = context.getSharedPreferences(
spFileName, Context.MODE_PRIVATE);
Boolean result = setPreferences.getBoolean(strKey, strDefault);
return result;
}
public static void putBoolean(Context context, String strKey,
Boolean strData) {
SharedPreferences activityPreferences = context.getSharedPreferences(
spFileName, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = activityPreferences.edit();
editor.putBoolean(strKey, strData);
editor.commit();
}
}
二、WelcomeGuideActivity中,我们使用ViewPager以加载多个引导页面使其可以左右滑动
不多说,请看
WelcomeGuideActivity.java
代码:
public class WelcomeGuideActivity extends Activity implements View.OnClickListener {
private ViewPager vp;
private GuideViewPagerAdapter adapter;
private List<View> views;
private Button startBtn;
// 引导页图片资源
private static final int[] pics = { R.layout.guide_view1,
R.layout.guide_view2, R.layout.guide_view3};
// 底部小点图片
private ImageView[] dots;
// 记录当前选中位置
private int currentIndex;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_guide);
views = new ArrayList<View>();
// 初始化引导页视图列表
for (int i = 0; i < pics.length; i++) {
View view = LayoutInflater.from(this).inflate(pics[i], null);
if (i == pics.length - 1) {
startBtn = (Button) view.findViewById(R.id.btn_enter);
startBtn.setTag("enter");
startBtn.setOnClickListener(this);
}
views.add(view);
}
vp = (ViewPager) findViewById(R.id.vp_guide);
adapter = new GuideViewPagerAdapter(views);
vp.setAdapter(adapter);
vp.addOnPageChangeListener(new PageChangeListener());
initDots();
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
// 如果切换到后台,就设置下次不进入功能引导页
SharedPreferencesUtil.putBoolean(WelcomeGuideActivity.this, SharedPreferencesUtil.FIRST_OPEN, false);
finish();
}
@Override
protected void onStop() {
super.onStop();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
private void initDots() {
LinearLayout ll = (LinearLayout) findViewById(R.id.ll);
dots = new ImageView[pics.length];
// 循环取得小点图片
for (int i = 0; i < pics.length; i++) {
// 得到一个LinearLayout下面的每一个子元素
dots[i] = (ImageView) ll.getChildAt(i);
dots[i].setEnabled(false);// 都设为灰色
dots[i].setOnClickListener(this);
dots[i].setTag(i);// 设置位置tag,方便取出与当前位置对应
}
currentIndex = 0;
dots[currentIndex].setEnabled(true); // 设置为白色,即选中状态
}
private void setCurView(int position) {
if (position < 0 || position >= pics.length) {
return;
}
vp.setCurrentItem(position);
}
private void setCurDot(int position) {
if (position < 0 || position > pics.length || currentIndex == position) {
return;
}
dots[position].setEnabled(true);
dots[currentIndex].setEnabled(false);
currentIndex = position;
}
@Override
public void onClick(View v) {
if (v.getTag().equals("enter")) {
enterMainActivity();
return;
}
int position = (Integer) v.getTag();
setCurView(position);
setCurDot(position);
}
private void enterMainActivity() {
Intent intent = new Intent(WelcomeGuideActivity.this,
WelcomeActivity.class);
startActivity(intent);
SharedPreferencesUtil.putBoolean(WelcomeGuideActivity.this, SharedPreferencesUtil.FIRST_OPEN, false);
finish();
}
private class PageChangeListener implements ViewPager.OnPageChangeListener {
@Override
public void onPageScrollStateChanged(int position) {
}
@Override
public void onPageScrolled(int position, float arg1, int arg2) {
}
@Override
public void onPageSelected(int position) {
// 设置底部小点选中状态
setCurDot(position);
}
}
}
我们用了三个页面guide_view1、guide_view2、guide_view3作为引导页面,布局类似,只是guide_view3多了个点击进入的Button。
以下是guide_view3.xml
<?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" >
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:class="lazy" data-src="@mipmap/guide_img3" />
<Button
android:id="@+id/btn_enter"
android:layout_width="100dp"
android:layout_height="26dp"
android:layout_gravity="bottom|center_horizontal"
android:layout_marginBottom="75dp"
android:background="@drawable/button_shape"
android:text="@string/entry"
android:textColor="@color/white"
android:textSize="18sp"
android:visibility="visible" />
</FrameLayout>
WelcomeGuideActivity
中值得注意的是该Button点击事件的处理,在点击Button后我们并没有直接进入MainActivity
,而是先把SharedPreferences
中标记是否第一次进入的布尔值设为false,而后再次进入WelcomeActivity
,此时WelcomeActivity
会直接setContentView()
然后启动动画,进入MainActivity
。
以上,我们华丽丽的引导页就完成了。希望本文中能对你的引导页提供帮助,和在大家学习Android开发中有所参考,谢谢大家对编程网的支持。
您可能感兴趣的文章:Android RxJava创建操作符IntervalAndroid中的Retrofit+OkHttp+RxJava缓存架构使用Android性能优化之利用Rxlifecycle解决RxJava内存泄漏详解RxJava入门指南及其在Android开发中的使用示例Android中通过RxJava进行响应式程序设计的入门指南Android上传多张图片的实例代码(RxJava异步分发)Android中用RxJava和ViewPager实现轮播图android使用RxJava实现预加载Android Retrofit和Rxjava的网络请求Android RxJava创建操作符Timer的方法
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341