最近我旁边的兄弟同时是我的前辈、导师给我提了一个简单需求,说实现App的闪屏页面,让其全屏显示一张图片,我当时还没明白“闪屏”是什么功能,后来联想到打开游戏的时候横竖屏切换的场景,然后感觉好像很难,于是去百度一下,WTF,闪屏就是SplashActivity!不就是一个广告页么,这也太TM简单了,然后我就说,30分钟之内让你看到效果,你先去睡一会,事实证明我还是Too Young。因为某些原因项目的layout目录下不能放xml文件,不管是手动新建的,还是通过Activity新建的都会报错,当然我后面想了一下,可能是因为使用cocos的原因res目录被锁定了,所以我只好转变策略在代码中实现视图逻辑了,虽然这显然违背了Android数据和视图分离的原则,代码如下
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (VERSION.SDK_INT > 11 && VERSION.SDK_INT < 19) { // lower api
View v = getWindow().getDecorView();
v.setSystemUiVisibility(View.GONE);
} else if (Build.VERSION.SDK_INT >= 19) {
// for new api versions.
View decorView = getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
| View.SYSTEM_UI_FLAG_IMMERSIVE | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
decorView.setSystemUiVisibility(uiOptions);
}
// 初始化布局,设置相关参数
LinearLayout layout = new LinearLayout(this);
layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
layout.setOrientation(LinearLayout.VERTICAL);
layout.setGravity(Gravity.CENTER);
// 初始化图片控件
ImageView imView = new ImageView(this);
imView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
imView.setScaleType(ScaleType.CENTER_CROP);
AssetManager assets = getResources().getAssets();
// 文件路径是从assets文件夹下开始的,开头不要加/
String fileName = "res/img1.jpg";
try {
InputStream is = assets.open(fileName);
Bitmap bm = BitmapFactory.decodeStream(is);
imView.setImageBitmap(bm);
} catch (IOException e) {
e.printStackTrace();
}
// 将控件加入布局
layout.addView(imView);
setContentView(layout);
// 1000毫秒为1秒
int time = 2000;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
startActivity(new Intent(SplashActivity.this, AppActivity.class));
finish();
}
}, time);
}
下面简单讲解一下,刚开始那一段是去掉标题栏和导航键的,代码生成其实和xml中定义的差不多,只不过没有那么直观,LayoutParam来设置width和height,我这里要全屏显示,所以都是Match_Parent,然后setScaleType是设置缩放模式,考虑到图片宽高比不同要全屏显示就必须缩放图片,handler用于延时操作。