闪屏页+引导页

author author     2022-08-05     453

关键词:

实现原理:

用SharedPreferences实现。
创建一个boolean的变量,默认值为true。
当判断这个变量是true的时候,说明是第一次运行,就跳转到另一个引导页面,否则进入主页面。

引导页面跳转到最后一张图片时,点击某按钮发生跳转事件,回到MainActivity,此时把变量的值改成false。

引导图效果用ViewPager实现。

下面附上代码:

splash.xml:

<?xml version="1.0" encoding="utf-8"?>
<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="com.zn.Activity.SplashActivity">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:background="@drawable/w01"
android:scaleType="centerCrop" />

</RelativeLayout>

guid.xml:

<?xml version="1.0" encoding="utf-8"?>
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.zn.Activity.GuidActivity">
<android.support.v4.view.ViewPager
android:id="@+id/guid_viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true">
</android.support.v4.view.ViewPager>
<LinearLayout
android:id="@+id/viewgroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="38.0dp"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:clickable="true"
android:padding="15.0dip"
android:src="@drawable/dot" />

<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:clickable="true"
android:padding="15.0dip"
android:src="@drawable/dot" />

<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:clickable="true"
android:padding="15.0dip"
android:src="@drawable/dot" />
</LinearLayout>
</RelativeLayout>
引导页布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<ImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_centerInParent="true"
android:adjustViewBounds="false"
android:focusable="true"
android:scaleType="centerCrop"
android:background="@drawable/guide01"/>
</LinearLayout>
闪屏页activity:
package com.zn.Activity;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Window;

/**
* Created by admin on 2016/8/3.
*/
public class SplashActivity extends Activity {
boolean isFirstIn = false;
private static final int GO_HOME = 1000;
private static final int GO_GUIDE = 1001;

private static final long SPLASH_DELAY_MILLIS = 1000;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case GO_HOME:
goHome();
break;
case GO_GUIDE:
goGuide();
break;
}

super.handleMessage(msg);
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);//去标题栏
setContentView(R.layout.activity_splash);
init();
}

private void init() {
// 读取SharedPreferences中需要的数据
// 使用SharedPreferences来记录程序的使用次数
SharedPreferences preferences = getSharedPreferences(
Icontes.SHAREDPREFERENCES_NAME, MODE_PRIVATE);

// 取得相应的值,如果没有该值,说明还未写入,用true作为默认值
isFirstIn = preferences.getBoolean("isFirstIn", true);
// 判断程序与第几次运行,如果是第一次运行则跳转到引导界面,否则跳转到主界面
if (!isFirstIn) {
// 使用Handler的postDelayed方法,1秒后执行跳转到MainActivity
mHandler.sendEmptyMessageDelayed(GO_HOME, SPLASH_DELAY_MILLIS);
} else {
mHandler.sendEmptyMessageDelayed(GO_GUIDE, SPLASH_DELAY_MILLIS);
}

}

private void goHome() {
Intent intent = new Intent(SplashActivity.this, MainActivity.class);
SplashActivity.this.startActivity(intent);
SplashActivity.this.finish();
}

private void goGuide() {
Intent intent = new Intent(SplashActivity.this, GuidActivity.class);
SplashActivity.this.startActivity(intent);
SplashActivity.this.finish();
}
}
引导页activity:
package com.zn.Activity;

import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;

import com.zn.Adapter.ViewPagerApter;

import java.util.ArrayList;
import java.util.List;

public class GuidActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener{
private ViewPager viewPager;
private ViewPagerApter viewPagerApter;
private List<View> views;

//底部小圆点图片
private ImageView[] dots;
//记录当前选中的位置
private int currentIndex;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_guid);

//初始化页面
initViews();
//初始化底部小圆点
initDots();

}

private void initViews(){
LayoutInflater inflater=LayoutInflater.from(this);
views=new ArrayList<View>();
//初始化引导页图片列表
views.add(inflater.inflate(R.layout.layout_item1,null));
views.add(inflater.inflate(R.layout.layout_item2,null));
views.add(inflater.inflate(R.layout.layout_item5,null));

//初始化Adapter
viewPagerApter=new ViewPagerApter(views,this);

viewPager= (ViewPager) findViewById(R.id.guid_viewpager);
viewPager.setAdapter(viewPagerApter);
//绑定回调
viewPager.setOnPageChangeListener(this);


}

private void initDots(){
LinearLayout linearLayout= (android.widget.LinearLayout) findViewById(R.id.viewgroup);
dots=new ImageView[views.size()];

//循环获取小点的图片
for (int i=0;i<views.size();i++){
dots[i]= (ImageView) linearLayout.getChildAt(i);
dots[i].setEnabled(true);//

}
currentIndex=0;
dots[currentIndex].setEnabled(false);//设为白色,即选中状态

}

private void setCurrentDot(int position){
if (position<0||position>views.size()-1||currentIndex==position){
return;

}
dots[position].setEnabled(false);
dots[currentIndex].setEnabled(true);
currentIndex=position;
}

//当前页面滑动时调用
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

}

//当前页面选中时调用
@Override
public void onPageSelected(int position) {
//设置底部小圆点选中状态
setCurrentDot(position);

}

//滑动状态改变时调用
@Override
public void onPageScrollStateChanged(int state) {

}
}
适配器:
package com.zn.Adapter;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.zn.Activity.Icontes;
import com.zn.Activity.MainActivity;
import com.zn.Activity.R;

import java.util.List;

/**
* Created by admin on 2016/8/3.
*/
public class ViewPagerApter extends PagerAdapter {
private List<View> views;
private Activity activity;


public ViewPagerApter(List<View> views, Activity activity) {
this.views = views;
this.activity = activity;
}

//销毁position位置的界面
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
((ViewPager) container).removeView(views.get(position));
}

//获得当前的页面数
@Override
public int getCount() {
if (views != null) {
return views.size();
}
return 0;
}

@Override
public void finishUpdate(ViewGroup container) {

}

//初始化position的界面
@Override
public Object instantiateItem(ViewGroup container, int position) {
((ViewPager) container).addView(views.get(position), 0);
if (position == views.size() - 1) {
ImageView mStartWeiboImageButton = (ImageView) container.findViewById(R.id.iv_start_weibo);
mStartWeiboImageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//设置已经引导
setGuided();
SharedPreferences preferences = activity.getSharedPreferences(
Icontes.SHAREDPREFERENCES_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean("isFirstIn", false);
editor.commit();
goHome();
}
});
}
return views.get(position);
}

private void goHome() {
//跳转
Intent intent = new Intent(activity, MainActivity.class);
activity.startActivity(intent);
activity.finish();
}

private void setGuided() {
SharedPreferences preferences = activity.getSharedPreferences(Icontes.SHAREDPREFERENCES_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
//存入数据
editor.putBoolean("isFirstIn", false);
//提交修改
editor.commit();
}

//判断是否由对象生成界面
@Override
public boolean isViewFromObject(View view, Object object) {
return (view == object);
}

@Override
public void restoreState(Parcelable state, ClassLoader loader) {

}

@Override
public Parcelable saveState() {
return null;
}

@Override
public void startUpdate(ViewGroup container) {


}
}小圆点xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:drawable="@drawable/dark_dot" android:state_enabled="true"/>
<item android:drawable="@drawable/white_dot" android:state_enabled="false"/>

</selector>

开始体验按钮:
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/tiyan" />
<item android:drawable="@drawable/tiyan" />
</selector>



app闪屏页如何实现?告别白屏!看这一篇就够了!

...之后登陆界面会很突兀地跳出来布局,最好的做法是实现闪屏页,由闪屏页跳转到MainActivity去,再跳转完成后finish掉闪屏页,这样就很优雅地完成了app启动——>启动完成的效果。  本期,我们就来模仿微信来实现微信... 查看详情

手机安全卫士——闪屏页相关处理

根据功能模块划分(Android开发推荐此方法)   -Activity mobilesafe.activty   -后台服务 mobilesafe.service   -广播接受者mobilesafe.receiver   -数据库mobilesafe.db 查看详情

flutter:快速创建简单闪屏页

参考技术A近来闲暇时间一直在做Flutter,闪屏页是一个比较常见的需求,网上的闪屏页教程大部分是那种类似于广告页,而非iOS中的LaunchScreen性质的闪屏页.按照原来的方案我们要配置闪屏页的话,我们需要同时配置两端的闪屏页,那么... 查看详情

闪屏页和右上角的倒计时跳转

效果图:闪屏页用到了handler和CountDownTimer类,还需配置一下Activity的主题,这里是:android:theme="@android:style/Theme.NoTitleBar.Fullscreen"全屏主题的意思。实现源码:1packagecom.example.shanping;23importjava.lang.ref.WeakReference;45import 查看详情

这交互炸了:闪屏页是像云一样消失的

《交互炸了》或许是一系列高端特效教程,文中会介绍一些比较炫酷的特效,以及实现的思路。特效实现本身也许不会有太大的难度。难点在于实现的思路。一旦思路被打开,特效将很简单实现。效果项目地址:https://github.com/github... 查看详情

app引导页和启动页有啥区别

...面到底是什么,又有什么区别呢?下面就是关于启动页、闪屏、引导页的简单的归纳和总结,希望对大家有所帮助。UI基础知识:启动页、闪屏和引导页的区别01启动页(launchscreen)1.定义当app被用户打开时,在app启动过程中被用户... 查看详情

这交互炸了:闪屏页是像云一样消失的(代码片段)

《交互炸了》或许是一系列高端特效教程,文中会介绍一些比较炫酷的特效,以及实现的思路。特效实现本身也许不会有太大的难度。难点在于实现的思路。一旦思路被打开,特效将很简单实现。效果项目地址:https://github.... 查看详情

淘宝直播全屏页重排算法实践

本文旨在分享正负反馈序列建模与多目标优化在淘宝直播排序上的实践经验。背景介绍直播带货是“内容+电商”这种新商业模式最火热的应用之一,传统互联网电商如PDD、JD等均已上线直播带货平台,众多内容赛道玩... 查看详情

如何制作一个闪屏页面

...号【小蚂蚁教你做游戏】,学习更多游戏开发原创教程。闪屏(Splash)指的是当你打开一个应用时,首先映入眼帘的那个界面。通常闪屏页面都会比较简单,因为要一闪而过(这大概就是为什么叫做闪屏了),一般都会放置产品的LOGO... 查看详情

商业级项目——基金客户端的架构设计与开发(上)

...帮助、意见反馈等。   项目运行首先会有一个闪屏页,然后进入的是一个新手引导页(只显示一次),可以向右滑动, 查看详情

适配又来了,android12十项新特性,紧跟潮流拥抱未来(代码片段)

...等级一、启动页面在过去的一段时间内,每个应用的闪屏页其实是由开发者自己定义的,并没有一个明确的标准。但在Android12的手机上,即使我们不做任何适配,系统也为默认提供一个闪屏动画。UI大大们会满足... 查看详情

启动页和引导页

启动页是app启动时的一个页面引导页是启动后出现的页面,一般引导页不会超过5页,目的是让用户对产品主功能有一个大致的了解。引导页的写法普通页面的写法相同     查看详情

【ios_github】引导页/首次安装引导页/渐变引导页/app介绍页/新功能介绍页

参考技术A注:假使自己传入<跳过>按钮背景图片,需要注意一下大小,按钮大小设置是根据图片大小动态设置的GitHub主页CSDNBlogEmail:jinjob@icloud.com 查看详情

hander实现引导页

 使用Hander实现引导页:代码:/***引导页*/publicclassSplashActivityextendsActivityprivatestaticfinalintGO_MAIN=1000;//延迟时间privatestaticfinallongSPLASH_DELAY_MILLIS=500;@OverrideprotectedvoidonCreate(@NullableB 查看详情

app引导页和启动页有啥区别

参考技术Aapp引导页和启动页有什么区别最大的区别:身份不同,承载的含义也不同APP启动页面是一个APP的优雅的开场礼或者是见面礼。APP引导页是一个新使用者的专属礼。引导新使用者了解APP的一个过程。同时也是每一次迭代... 查看详情

android12适配你准备好了吗?(代码片段)

...案。一、启动页面在过去的一段时间内,每个应用的闪屏页其实是由开发者自己定义的,并没有一个明确的标准。但在Android12的手机上,即使我们不做任何适配,系统也为默认提供一个闪屏动画。UI大大们会满足... 查看详情

app引导页

根据引导页的目的、出发点不同,可以将其分为功能介绍类、使用说明类、推广类、问题解决类,一般引导页不会超过5页。功能介绍类功能介绍类引导页主要是对产品的主要功能进行展示,让用户对产品主功能有一个大致的了... 查看详情

ios引导页启动页(代码片段)

前言这里使用launchScreen、.storyboard文件创建启动图和引导页。首次打开项目或者更新后第一次打开时展示引导页,保存有用户信息时进入首页,否则进入登录注册页面。正文1.动态启动图将LaunchScreen.storyboard文件上放入一... 查看详情