欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android技巧一之启动屏+新功能左右导航逻辑

程序员文章站 2024-02-20 22:33:58
前言 很长一段时间没写博客了,再不写点东西真说不过去,把工作上的一些有价值的东西整理出来分享,在当下还有点时效性,不然迟早会烂在肚子里的。还记得之前小巫有个开源计划是想实...

前言

很长一段时间没写博客了,再不写点东西真说不过去,把工作上的一些有价值的东西整理出来分享,在当下还有点时效性,不然迟早会烂在肚子里的。还记得之前小巫有个开源计划是想实现一个星期开发app,现在把它拾起来,计划没有实行起来跟我那懒惰的身躯有关,任何伟大的事情都需要强大的执行力才能实现,慢一点没关系,能创造点东西就是值得的事情。

本篇博客先介绍一个app最常见的特性,就是新功能属性介绍和启动屏,一般会怎么实现呢,这不就打算告诉大家了么。

先说逻辑

先判断是否第一次启动app,如果是,则进入功能使用导航(最简单的做法就是,左右滑动切换查看,滑动到最后一页点击按钮进入首页)。

如果不是,则显示启动屏,2秒之后进入首页。

逻辑是很简单,如果有广告怎么办?广告肯定是从服务器拿,但会缓存到本地,没网的时候可以显示,可以使用webview来显示广告,反正笔者是这样干,具体实现先不说。

看看效果

Android技巧一之启动屏+新功能左右导航逻辑

上代码

splashactivity.java

package com.devilwwj.featureguide;
import android.app.activity;
import android.content.intent;
import android.os.bundle;
import android.os.handler;
import com.devilwwj.featureguide.global.appconstants;
import com.devilwwj.featureguide.utils.sputils;
/**
* @desc 启动屏
* created by devilwwj on 16/1/23.
*/
public class splashactivity extends activity {
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
// 判断是否是第一次开启应用
boolean isfirstopen = sputils.getboolean(this, appconstants.first_open);
// 如果是第一次启动,则先进入功能引导页
if (!isfirstopen) {
intent intent = new intent(this, welcomeguideactivity.class);
startactivity(intent);
finish();
return;
}
// 如果不是第一次启动app,则正常显示启动屏
setcontentview(r.layout.activity_splash);
new handler().postdelayed(new runnable() {
@override
public void run() {
enterhomeactivity();
}
}, 2000);
}
private void enterhomeactivity() {
intent intent = new intent(this, mainactivity.class);
startactivity(intent);
finish();
}
}

代码解析:使用sharedpreference来保存app启动状态,如果为true,则进入功能导航,否则延迟2秒之后进入主页面。

welcomeguideactivity.java
package com.devilwwj.featureguide;
import android.app.activity;
import android.content.intent;
import android.os.bundle;
import android.support.v4.view.viewpager;
import android.support.v4.view.viewpager.onpagechangelistener;
import android.view.layoutinflater;
import android.view.view;
import android.view.view.onclicklistener;
import android.widget.button;
import android.widget.imageview;
import android.widget.linearlayout;
import com.devilwwj.featureguide.global.appconstants;
import com.devilwwj.featureguide.utils.sputils;
import java.util.arraylist;
import java.util.list;
/**
* 欢迎页
* 
* @author wwj_748
* 
*/
public class welcomeguideactivity extends activity implements onclicklistener {
private viewpager vp;
private guideviewpageradapter adapter;
private list<view> views;
private button startbtn;
// 引导页图片资源
private static final int[] pics = { r.layout.guid_view1,
r.layout.guid_view2, r.layout.guid_view3, r.layout.guid_view4 };
// 底部小点图片
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_login);
startbtn.settag("enter");
startbtn.setonclicklistener(this);
}
views.add(view);
}
vp = (viewpager) findviewbyid(r.id.vp_guide);
// 初始化adapter
adapter = new guideviewpageradapter(views);
vp.setadapter(adapter);
vp.setonpagechangelistener(new pagechangelistener());
initdots();
}
@override
protected void onresume() {
super.onresume();
}
@override
protected void onpause() {
super.onpause();
// 如果切换到后台,就设置下次不进入功能引导页
sputils.putboolean(welcomeguideactivity.this, appconstants.first_open, true);
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); // 设置为白色,即选中状态
}
/**
* 设置当前view
* 
* @param position
*/
private void setcurview(int position) {
if (position < 0 || position >= pics.length) {
return;
}
vp.setcurrentitem(position);
}
/**
* 设置当前指示点
* 
* @param 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,
splashactivity.class);
startactivity(intent);
sputils.putboolean(welcomeguideactivity.this, appconstants.first_open, true);
finish();
}
private class pagechangelistener implements onpagechangelistener {
// 当滑动状态改变时调用
@override
public void onpagescrollstatechanged(int position) {
// arg0 ==1的时辰默示正在滑动,arg0==2的时辰默示滑动完毕了,arg0==0的时辰默示什么都没做。
}
// 当前页面被滑动时调用
@override
public void onpagescrolled(int position, float arg1, int arg2) {
// arg0 :当前页面,及你点击滑动的页面
// arg1:当前页面偏移的百分比
// arg2:当前页面偏移的像素位置
}
// 当新的页面被选中时调用
@override
public void onpageselected(int position) {
// 设置底部小点选中状态
setcurdot(position);
}
}
}

代码解析:左右滑动是使用viewpager来做的,切换4个不同的view,监听viewpager的页面切换事件来更改底部指示点的切换,滑动到最后一个页面,设置按钮的点击事件,点击进入首页。

github

更多的代码上的细节,大家看源工程,代码已经上传到github,欢迎大家down下来使用。

Android技巧一之启动屏+新功能左右导航逻辑