注意:在Worklight 6.2中,控制本机/ Web关系要容易得多,所以现在这个问题已经过时了。
Worklight Studio 5.0.6,Android模拟器4.0.2
有关Android中启动画面的问题。下面的代码来自this question的答案。它似乎工作得很好。我首先要关注的是硬编码延迟
super.loadUrl(getWebMainFilePath(), 10000);
如果省略10000(10秒)延迟,那么我们会在本机启动画面和第一个网页之间看到一个空白屏幕。我的猜测是,根据设备的CPU速度,可以向下调整10秒,或者在慢速设备上可能需要增加。所以我想知道是否有一个不同的回调我们可以使用而不是依赖于硬编码10秒。
其次,假设我想要一些不太静态的初始屏幕,在调用super.loadUr()之前,按照this article添加代码是否足够?我熟悉从JavaScript调用本机页面的材料,但是在这里我们将从本机页面开始,并且在某些时候想要将控制传递给JavaScript世界,而这个世界以前没有被初始化。
import android.os.Bundle;
import com.worklight.androidgap.WLDroidGap;
public class App02 extends WLDroidGap {
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
super.setIntegerProperty("splashscreen", R.drawable.splash);
// active code here??
super.bindBrowser(appView);
}
/**
* onWLInitCompleted is called when the Worklight runtime framework initialization is complete
*/
@Override
public void onWLInitCompleted(Bundle savedInstanceState){
super.loadUrl(getWebMainFilePath(), 10000);
}
}
答案 0 :(得分:4)
你可以这样做。
1)。将此代码添加到您的主要Android类java类:
/*
* Shows the splash screen over the full Activity
*/
protected void showSplashScreen() {
mThisapp.runOnUiThread(new Runnable() {
public void run() {
// Get reference to display
final Display display = getWindowManager().getDefaultDisplay();
// Get current orientation
final int rotation = display.getRotation();
final String orientation;
switch (rotation) {
default:
case Surface.ROTATION_0:
orientation = "Portrait";
break;
case Surface.ROTATION_90:
orientation = "Landscape";
break;
case Surface.ROTATION_180:
orientation = "Reverse Portrait";
break;
case Surface.ROTATION_270:
orientation = "Reverse Landscape";
break;
}
Log.i(TAG, "Orientation :: " + orientation);
// Create the layout for the dialog
final LinearLayout root = new LinearLayout(mThisapp.getActivity());
// This method was deprecated in API level 13: display.getHeight and display.getWidth
// Gets the size of the display, in pixels
final Point outSize = new Point();
display.getSize(outSize);
root.setMinimumHeight(outSize.y);
root.setMinimumWidth(outSize.x);
root.setOrientation(LinearLayout.VERTICAL);
root.setBackgroundColor(mThisapp.getIntegerProperty("backgroundColor",
Color.WHITE));
root.setLayoutParams(new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT, 0.0F));
//root.setBackgroundResource(mThisapp.splashscreen);
// ImageView Setup
final ImageView imageView = new ImageView(mBaseContext);
// Setting image resource
imageView.setImageResource(mThisapp.splashscreen);
// Setting image position
imageView.setLayoutParams(new LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
root.addView(imageView);
// Create and show the dialog
splashDialog = new Dialog(mThisapp,
android.R.style.Theme_Translucent_NoTitleBar);
// Check to see if the splash screen should be full screen
if ((getWindow().getAttributes().flags & WindowManager.LayoutParams.FLAG_FULLSCREEN) == WindowManager.LayoutParams.FLAG_FULLSCREEN) {
splashDialog.getWindow().setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
splashDialog.setContentView(root);
splashDialog.setCancelable(false);
splashDialog.show();
}
});
}
2)。在public void onCreate(final Bundle savedInstanceState)中,添加行:
super.onCreate(savedInstanceState);
mThisapp = this;
mBaseContext = getBaseContext();
// Add splash screen
super.setIntegerProperty("splashscreen", R.drawable.splash);
...
// Show the splash dialog
this.splashscreen = this.getIntegerProperty("splashscreen", 0);
showSplashScreen();
// End of apache/cordova-android/DroidGap
...
}
是的,你必须在res文件夹中有一个启动图像(在.png中)。
3)。修改onMessage
@Override
/**
* Called when a message is sent to plugin.
*
* @param id The message id
* @param data The message data
* @return Object or null
*/
public Object onMessage(final String id, final Object data) {
Log.d(TAG, "onMessage(" + id + "," + data + ")");
if ("splashscreen".equals(id)) {
if (data != null && "hide".equals(data.toString())) {
if (mThisapp.appView.getVisibility() != View.VISIBLE) {
mThisapp.runOnUiThread(new Runnable() {
public void run() {
final Animation animationIn = AnimationUtils
.loadAnimation(mBaseContext, R.anim.zoom_in); animationIn.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationEnd(
final Animation animation) {
}
@Override
public void onAnimationRepeat(
final Animation animation) {
}
@Override
public void onAnimationStart(
final Animation animation) {
if (splashDialog != null)
mThisapp.removeSplashScreen();
}
});
mThisapp.appView.setVisibility(View.VISIBLE);
mThisapp.appView.requestFocus();
mThisapp.appView.startAnimation(animationIn);
}
});
} else {
this.removeSplashScreen();
}
}
return null;
} else if ("spinner".equals(id)) {
if (data != null && "stop".equals(data.toString())) {
this.spinnerStop();
return null;
}
}
return super.onMessage(id, data);
}
4)。验证config.xnl是否有此行
< plugin name="SplashScreen" value="org.apache.cordova.SplashScreen" />
5)。在Worklight初始化完成块中,添加如下:
if (navigator && navigator.splashscreen)
navigator.splashscreen.hide();
然后你有一个带有后端加载的完整启动画面。准备好后,显示第一个屏幕。