前言:欢迎界面我理解的意思是,启动程序也想要一定时间,不如用线程控制,打一下广告
效果图:
这里我就先写一个最简单一个界面,3秒后进入主程序。
manifest里这段代码,就是控制开启程序的第一个页面
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
public class SplashActivity extends AppCompatActivity {
Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
SharedPreferences sp = getPreferences(MODE_PRIVATE);
boolean isFirst = sp.getBoolean("isFirst", true);
Intent intent = new Intent();
if (isFirst) {
sp.edit().putBoolean("isFirst", false).commit();
//如果用户是第一次安装应用并进入
intent.setClass(SplashActivity.this, LoginActivity.class);
} else {
intent.setClass(SplashActivity.this, MainActivity.class);
}
startActivity(intent);
finish();
}
}, 3000);
}
}
这是第一个这个适应于 sqlite 数据库
这个适用于Bmob 数据库
public class SplashActivity extends AppCompatActivity {
Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
Bmob.initialize(this,"","Bomb");
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = new Intent();
BmobUser bmobUser = BmobUser.getCurrentUser();
if(bmobUser != null){
// 允许用户使用应用
intent.setClass(SplashActivity.this, MainActivity.class);
}else{
//缓存用户对象为空时, 可打开用户注册界面…
intent.setClass(SplashActivity.this, LoginActivity.class);
}
startActivity(intent);
finish();
}
}, 3000);
}
}
第二种 调用人家已经写好的开源代码,我觉得 用Android studio最大好处 导包容易啊,但是报错也容易,苦笑。
https://github.com/PaoloRotolo/AppIntro 这里我引用的这个开源框架。
但是我有点没有看懂 ,感觉版本太多,我有个习惯不喜欢看教学视频,一般直接看源码。
这个先用简单的等我真个项目结束后,我用photoshop p3张图功能描述图 做安装简介,可以用开源框架,也可以写4页滑动,在最后一页,放一个按钮,跳进主程序。主要是虚拟机慢,不喜欢停顿的时刻。
这篇博客时隔快一年了 点有来写一下3页轮播欢迎页
效果图:
逻辑处理判断:
欢迎界面实现的逻辑是判断用户是否首次进入app,如果是则进入欢迎页,欢迎页是由ViewPager实现的三页引导页滑动轮播,最后一页有立即体验按钮,点击后通过SharePreference保存用户已经不是第一次打开app了。如果不是首次进入欢迎,通过后台线程控制,30秒后自动跳转,判断用户是否已经登录,如果登录过,则进入主界面,否则进入登录界面。
ViewPager :引导页的轮播
SplashActivity .java
public class SplashActivity extends BaseActivity {
private Handler mHandler = new Handler();
@Override
protected int contentViewID() {
return R.layout.activity_splash;
}
@Override
protected void initialize() {
StatusBarUtils.setLightMode(SplashActivity.this);
setTopTitle("",false);
boolean isFirstOpen = (boolean) SharePreferenceUtil.get(SplashActivity.this, ConstantConfig.FIRST_OPEN, false);
if (!isFirstOpen) {
startActivityFinish(GuideActivity.class);
return;
}
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
BmobUser bmobUser = BmobUser.getCurrentUser(MyUser.class);
if(bmobUser != null){
startActivityFinish(MainActivity.class);
} else {
startActivityFinish(LoginActivity.class);
}
}
},3000);
}
}
GuideActivity.java
public class GuideActivity extends BaseActivity {
@BindView(R.id.viewpager_guide)
ViewPager vpGuide;
@BindView(R.id.ll)
LinearLayout llDot;
private GuideViewPagerAdapter guideAdapter;
private List<View> views = new ArrayList<>();
// 引导页图片资源
private static final int[] pics = {R.layout.layout_guide1, R.layout.layout_guide2, R.layout.layout_guide3};
// 底部小点图片
private ImageView[] dotViews;
@Override
protected int contentViewID() {
return R.layout.activity_guide;
}
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
protected void initialize() {
setTopTitle("",false);
StatusBarUtils.setLightMode(GuideActivity.this);
initBtn();
// 初始化adapter
guideAdapter = new GuideViewPagerAdapter(views);
vpGuide.setAdapter(guideAdapter);
vpGuide.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
// 当新的页面被选中时调用
@Override
public void onPageSelected(int position) {
// 设置底部小点选中状态
setCurDot(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
initDots();
}
private void initBtn() {
// 初始化引导页视图列表
int btnIndex = pics.length - 1;
for (int i = 0; i < pics.length; i++) {
View view = LayoutInflater.from(this).inflate(pics[i], null);
views.add(view);
if (i == btnIndex) {
view.findViewById(R.id.btn_enter).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 如果切换到后台,就设置下次不进入功能引导页
SharePreferenceUtil.put(GuideActivity.this, ConstantConfig.FIRST_OPEN, true);
startActivityFinish(LoginActivity.class);
}
});
}
}
}
/**
* 设置当前指示点
*
* @param position
*/
private void setCurDot(int position) {
for (int i = 0; i < dotViews.length; i++) {
if (position == i) {
dotViews[i].setSelected(true);
} else {
dotViews[i].setSelected(false);
}
}
}
private void initDots() {
LinearLayout.LayoutParams mParams = new LinearLayout.LayoutParams(45, 40);
//设置小圆点左右之间的间隔
mParams.setMargins(6, 0, 6, 0);
dotViews = new ImageView[pics.length];
//判断小圆点的数量,从0开始,0表示第一个
for (int i = 0; i < pics.length; i++) {
ImageView imageView = new ImageView(this);
imageView.setLayoutParams(mParams);
imageView.setImageResource(R.drawable.selector_dot);
if (i == 0) {
//默认启动时,选中第一个小圆点
imageView.setSelected(true);
} else {
imageView.setSelected(false);
}
//得到每个小圆点的引用,用于滑动页面时,(onPageSelected方法中)更改它们的状态。
dotViews[i] = imageView;
//添加到布局里面显示
llDot.addView(imageView);
}
}
}
PagerAdapter 适配器
public class GuideViewPagerAdapter extends PagerAdapter {
private List<View> views;
private View mView;
private Object mObject;
public GuideViewPagerAdapter(List<View> views) {
this.views = views;
}
// 获取要滑动的控件的数量,在这里我们以滑动的广告栏为例,那么这里就应该是展示的广告图片的ImageView数量
@Override
public int getCount() {
if (views != null) {
return views.size();
}
return 0;
}
// 来判断显示的是否是同一张图片,这里我们将两个参数相比较返回即可
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view == object;
}
// PagerAdapter只缓存三张要显示的图片,如果滑动的图片超出了缓存的范围,就会调用这个方法,将图片销毁
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView(views.get(position));
}
// 当要显示的图片可以进行缓存的时候,会调用这个方法进行显示图片的初始化,我们将要显示的ImageView加入到ViewGroup中,然后作为返回值返回即可
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(views.get(position));
return views.get(position);
}
}