gpt4 book ai didi

android - 使用带有 flash 的 webview 时屏幕闪烁

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:02:07 27 4
gpt4 key购买 nike

编辑:我制作了一个演示 apk,所以你可以理解我的意思:http://cl.ly/3g0s1p030j243y0p3m2F

对于我的应用程序,我想要一种“ super 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 的 Activity 都会闪烁,几毫秒的黑色屏幕,然后动画终于出现了。

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。

最佳答案

此答案稍后添加:

所以问题是 Adob​​e 的 Flash Player 在 WebView 中创建了一个 SurfaceView 并且 SurfaceView 出现和 Flash 之间存在延迟引擎懒得画任何东西。在那个小间隙中,SurfaceView 看起来完全是黑色的。

我找到的解决方案是继承 WebView 并将自定义的 SurfaceView 添加到 View 树中。其次,抑制对 Adob​​e View 的第一次 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 上,这完美地工作,因为 WebView 显示为纯白色,直到 Flash SurfaceView 开始绘制。您可能需要稍微调整一下,例如摆脱硬编码的 800x480 尺寸,并在不再需要时销毁白色 SurfaceView。

原始(错误)答案:

看来 Adob​​e 应该为此负责。

到目前为止我发现的最不糟糕的解决方法是:

  1. 将 WebView 父级的背景设置为兼容的颜色(即白色)。
  2. 最初隐藏 WebView。
  3. 等到您获得页面加载事件,然后排队一个可运行的对象以在延迟一秒后显示 WebView。

这意味着您在看到任何东西之前都会有一秒钟的延迟,但它比那个可怕的黑色闪光 afaik 更不刺耳。

布局:

<?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,这似乎很有可能)。

您可以使用上述桥接器,使用 ActionScript 调用执行 alert() 的 Javascript 函数。在您的 Java 代码中,您会将 mWebView1 连接到实现 onJsAlert()WebChromeClient .在该函数中,您将使 WebView 可见。

关于android - 使用带有 flash 的 webview 时屏幕闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5095977/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com