编辑:我制作了一个演示版apk,这样你就能理解我的意思:http://cl.ly/3g0s1p030j243y0p3m2F
对于我的应用程序,我需要一种“超级Power Point”或主题演讲(商业团队将向他们的客户展示产品)使用Android平板电脑上的所有Android优点,手势等。由于Honeycomb还没有准备好,因为我们在3月之前需要它,我们选择了一些随机的Froyo平板电脑(Archos 101),但我的问题是我试过的每一款平板电脑/手机。
我做了一个非常棒的应用程序,但对于演示期间的一些动画,客户想要使用flash动画。因为我无法在Android中轻松编写动画(一些小电影/动画图形),而且时间不够,这似乎是一个好主意。
因此,在网上进行一些搜索之后,我使用了webview和这段代码:
WebView mWebView1 = (WebView) findViewById(R.id.webview1);
mWebView1.getSettings().setJavaScriptEnabled(true);
mWebView1.getSettings().setPluginsEnabled(true);
mWebView1.loadUrl("file:///android_asset/graph_01.swf");
这项工作相当不错,但在我试过的每台设备上(Archos 101,Nexus One,Nexus S,Galaxy S,Xperia,Desire,HTC Hero,以及更多)每次活动都有一个webview闪烁,几毫秒的黑色屏幕,然后动画终于出现。
PS:我的布局也很简单:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<WebView android:id="@+id/webview1" android:layout_height="fill_parent"
android:layout_width="fill_parent"></WebView>
</LinearLayout>
请帮助我,我无法想象我是唯一一个面对这个问题的人。
非常感谢您的帮助。你有我的所有代码和演示apk。
答案 0 :(得分:13)
此后添加此答案:
问题是,Adobe的Flash Player在SurfaceView
内创建WebView
,SurfaceView
出现与Flash引擎之间存在延迟,无法绘制任何内容。在那个小间隙中,SurfaceView看起来完全是黑色。
我发现的解决方案是将WebView子类化并将自定义的SurfaceView添加到视图树中。其次,禁止对Adobe视图的第一次draw()调用也很重要。我的子类WebView的代码如下:
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.webkit.WebView;
import android.widget.AbsoluteLayout;
public class FixAdobeWebView extends WebView {
View whiteView;
private boolean eatenFirstFlashDraw;
public FixAdobeWebView(Context context, AttributeSet attrs) {
super(context, attrs);
whiteView = new WhiteSurfaceView(context);
whiteView.setLayoutParams(new AbsoluteLayout.LayoutParams(800, 480, 0, 0));
addView(whiteView);
}
private class WhiteSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
public WhiteSurfaceView(Context context) {
super(context);
getHolder().addCallback(this);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Canvas canvas = holder.lockCanvas();
if (canvas != null) {
canvas.drawColor(Color.WHITE);
holder.unlockCanvasAndPost(canvas);
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) { }
@Override
public void surfaceDestroyed(SurfaceHolder holder) { }
}
//
// Override drawChild to eat the first draw of the FlashPaintSurface
//
@Override
protected boolean drawChild (Canvas canvas, View child, long drawingTime) {
if (!eatenFirstFlashDraw && child.getClass().getName().equals("com.adobe.flashplayer.FlashPaintSurface")) {
eatenFirstFlashDraw = true;
return true;
}
return super.drawChild(canvas, child, drawingTime);
}
}
布局XML应声明此类的实例,即:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@android:color/white"
>
<org.test.FixAdobeWebView android:id="@+id/webview1"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
/>
</LinearLayout>
在运行CM6.1的Nexus One上,这完全可以正常工作,因为在Flash SurfaceView开始绘图之前,WebView显示为纯白色。您可能需要稍微调整一下,例如摆脱硬编码的800x480尺寸,并在不再需要时摧毁白色SurfaceView。
ORIGINAL(WRONG)ANSWER:
看起来Adobe应该为此承担责任。
到目前为止,我发现的最不可靠的解决方法是:
这意味着你可以在看到任何东西之前得到一个保证一秒钟的延迟,但它不会像那个可怕的黑色闪光那样震撼。
布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@android:color/white"
>
<WebView android:id="@+id/webview1"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:visibility="invisible"
/>
</LinearLayout>
代码:
final Handler handler = new Handler();
...
final WebView mWebView1 = (WebView) findViewById(R.id.webview1);
mWebView1.getSettings().setJavaScriptEnabled(true);
mWebView1.getSettings().setPluginsEnabled(true);
mWebView1.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
mWebView1.setVisibility(View.VISIBLE);
}
}, 1000);
}
});
mWebView1.loadUrl("file:///android_asset/graph_01.swf");
可能有更好的方法可以消除对固定延迟的需求......
我用Flash做了一段时间,但我似乎记得Flash控件有一种方法可以使用浏览器的Javascript引擎(快速的Google可能会出现Flex Ajax Bridge似乎很可能)。 / p>
你可以做的是,使用上述桥接器,使用ActionScript调用一个执行alert()的Javascript函数。在您的Java代码中,您将mWebView1挂钩到实现 onJsAlert()
的WebChromeClient
。在该功能中,您可以使WebView可见。