splash android,Android SplashActivity

App启动页

打开一个应用程序时,第一眼看到的并不是主程序的界面,而是一个类似欢迎的界面,它叫SplashActivity。一般在这个页面可以做一些App数据初始化的工作。

SplashActivity的实现

实现的效果当用户点击App icon后,进入SplashActivity,大约经过1~2秒跳转到程序的主界面。

SplashActivity的全屏效果

一般App的启动页都是全屏。可以用于显示一些App logo,或者加载一些广告,图片...一般实现全屏效果有以下几种方式:

在代码中给window设置flag

给Application或者Activity设置主题

Window.setFlags

supportRequestWindowFeature(Window.FEATURE_NO_TITLE);

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);

注意:在setContentView()之前调用

style

@color/colorPrimary

@color/colorPrimaryDark

@color/colorAccent

true

false

true

在AndroidManifests.xml中给activity或者application的android:theme属性设置

选用哪一个windowNoTitle/windowActionBar属性

在编写SplashActivity时,选择继承自兼容包的AppCompatActivity。所以主题属性应该选择Theme.AppCompat Theme,否则运行时会中断。log如下:

Theme error log.png

而在Theme.AppCompat主题包含的属性中有两个属性windowNoTitle和windowActionBar用来决定是否显示默认的ActionBar。打开Theme.AppCompat.NoActionBar style后发现,就是修改了上述两个属性实现NoActionBar。

Theme.AppCompat.NoActionBar:

false

true

windowNoTitle和windowActionBar分别有两个类似的属性:android:windowNoTitle和android:windowNoActionBar这是Android系统包Activity的Theme的属性。所以改变这两个值是没有用的。

SplashActivity设置为启动页

在AndroidManifests.xml中为SplashActivity设置启动的属性

package="android.example.com.zhihudaily">

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:supportsRtl="true"

android:theme="@style/AppTheme">

>

android:theme="@style/AppTheme.NoTitle"/>

实现跳转

在指定的时间内跳转到程序的主界面有很多种方式,这里采用动画效果的方式。当动画结束时,自动跳转到指定的activity。

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

supportRequestWindowFeature(Window.FEATURE_NO_TITLE);

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);

setContentView(R.layout.activity_splash);

initView();

}

private void initView() {

mImgStart = (ImageView) findViewById(R.id.id_img_start);

iniImage();

}

private void iniImage() {

File dir = getFilesDir();

File imageFile = new File(dir, "start.jpg");

if(imageFile.exists()) {

mImgStart.setImageBitmap(BitmapFactory.decodeFile(imageFile.getAbsolutePath()));

}else {

mImgStart.setImageResource(R.mipmap.start);

}

ScaleAnimation scaleAnim = new ScaleAnimation(

1.0f,

1.2f,

1.0f,

1.2f,

Animation.RELATIVE_TO_SELF,

0.5f,

Animation.RELATIVE_TO_SELF,

0.5f

);

scaleAnim.setFillAfter(true);

scaleAnim.setDuration(3000);

scaleAnim.setAnimationListener(new Animation.AnimationListener() {

@Override

public void onAnimationStart(Animation animation) {

}

@Override

public void onAnimationEnd(Animation animation) {

//在这里做一些初始化的操作

//跳转到指定的Activity

startActivity();

}

@Override

public void onAnimationRepeat(Animation animation) {

}

});

mImgStart.startAnimation(scaleAnim);

}

private void startActivity() {

Intent intent = new Intent(SplashActivity.this, MainActivity.class);

startActivity(intent);

overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);

finish();

}

跳转效果问题

由于给SplashActivity实现了全屏的效果,而跳转到的Activity并非全屏时,会出现一个"卡顿"StatusBar从隐藏状态变成显示状态,导致Toolbar整体下移。如下图:

Toolbar下移.gif

同时发现Android5.0以后StatusBar默认状态时半透明状态。所以就想通过改变状态栏的颜色的同时,解决这个生硬的效果。

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

translucentStatusBar();

}

private void translucentStatusBar() {

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){

ViewGroup decorView = (ViewGroup) getWindow().getDecorView();

int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;

decorView.setSystemUiVisibility(option);

getWindow().setStatusBarColor(Color.TRANSPARENT);

}

}

这里先适配了5.0以上的系统

并且给ToolBar设置minHeight属性,这样看上去和ActionBar高度一样

private void initView() {

mToolbar = (Toolbar) findViewById(R.id.id_toolbar);

int statusBarHeightId = getResources().getIdentifier("status_bar_height", "dimen", "android");

int statusBarHeight = getResources().getDimensionPixelSize(statusBarHeightId);

TypedArray ta = obtainStyledAttributes(new int[]{android.R.attr.actionBarSize});

int actionBarSize = ta.getDimensionPixelSize(0, 0);

mToolbar.setMinimumHeight(actionBarSize + statusBarHeight);

}

最终效果:

SplahActivity.gif

你可能感兴趣的:(splash,android)