Android WebView 样式背景颜色:在 android 2.2 上忽略透明
Posted
技术标签:
【中文标题】Android WebView 样式背景颜色:在 android 2.2 上忽略透明【英文标题】:Android WebView style background-color:transparent ignored on android 2.2 【发布时间】:2011-06-27 13:15:03 【问题描述】:我正在努力创建一个具有透明背景的 WebView。
webView.setBackgroundColor(0x00FFFFFF);
webView.setBackgroundDrawable(myDrawable);
然后我用
加载一个html页面<body style="background-color:transparent;" ...
WebView 的背景颜色是透明的,但一旦加载页面,它就会被 html 页面中的黑色背景覆盖。这只发生在 android 2.2 上,它适用于 android 2.1。
那么在 html 页面代码中是否需要添加一些内容以使其真正透明?
【问题讨论】:
很抱歉,但对于我的问题,这里没有列出任何解决方案... :=( 无论如何谢谢...网页总是使用白色背景... 【参考方案1】:试试
webView.setBackgroundColor(0);
【讨论】:
webView.setBackgroundColor(0x00FFFFFF); 没有区别和 webView.setBackgroundColor(0x00);两者都应该是透明的颜色。【参考方案2】:实际上这是一个错误,到目前为止没有人找到解决方法。已创建问题。这个 bug 仍然存在于蜂窝中。
如果您认为它很重要,请加注星标:http://code.google.com/p/android/issues/detail?id=14749
【讨论】:
【参考方案3】:这对我有用,
mWebView.setBackgroundColor(Color.TRANSPARENT);
【讨论】:
你真的在 os 2.2 上测试过吗? 我发现这必须在 AFTER 加载 url 或数据之后调用。 如果您使用android:hardwareAccelerated="true"
,它在android 3.x 中不起作用
请注意,在 ICS(4.0.3) 上,除了上述 cmets;我必须禁用“设置 -> 开发人员选项 -> 强制 GPU 渲染”才能获得透明度以使用 API 级别 10。
实际上我不明白为什么这个答案会得到这么多赞成票。 webView.setBackgroundColor(0x00000000);与 webView.setBackgroundColor(0x00FFFFFF) 完全相同; alpha 值为 0x00。【参考方案4】:
以下代码对我有用,尽管我有多个 webviews 并且在它们之间滚动有点慢。
v.setBackgroundColor(Color.TRANSPARENT);
Paint p = new Paint();
v.setLayerType(LAYER_TYPE_SOFTWARE, p);
【讨论】:
这适用于 Honeycomb,但不幸的是不适用于 ICS。该死。但是如果你使用它,使用“android:layerType”属性在布局文件中指定它会更容易,因为这在旧版本上也能很好地工作,标签将被忽略。 在 ICS 上的工作是使用 AndroidManifest 中的android:hardwareAccelerated="false"
为 activity
元素停用整个活动的硬件加速。
没有必要创建 Paint 对象。 v.setLayerType(LAYER_TYPE_SOFTWARE, null);
也可以。【参考方案5】:
在加载 html 后设置 bg(从快速测试看来,加载 html 会重置 bg 颜色。这是针对 2.3 的)。
如果您从已经获得的数据中加载 html,只需执行 .postDelayed 并在其中设置 bg(例如透明)就足够了..
【讨论】:
【参考方案6】:我在 2.2 和 2.3 中也遇到了同样的问题。我通过在 html 中给出 alpa 值而不是在 android 中解决了这个问题。我尝试了很多东西,我发现setBackgroundColor();
颜色不适用于 alpha 值。 webView.setBackgroundColor(Color.argb(128, 0, 0, 0));
将不起作用。
所以这是我的解决方案,对我有用。
String webData = StringHelper.addSlashes("<!DOCTYPE html><head> <meta http-equiv=\"Content-Type\" " +
"content=\"text/html; charset=utf-8\"> </head><body><div style=\"background-color: rgba(10,10,10,0.5); " +
"padding: 20px; height: 260px; border-radius: 8px;\"> $$$ Content Goes Here ! $$$ </div> </body></html>");
在 Java 中,
webView = (WebView) findViewById(R.id.webview);
webView.setBackgroundColor(0);
webView.loadData(webData, "text/html", "UTF-8");
下面是输出截图。
【讨论】:
【参考方案7】:this earlier mentioned issue 的底部有一个解决方案。 这是两种解决方案的组合。
webView.setBackgroundColor(Color.TRANSPARENT);
webView.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);
在加载网址后将此代码添加到 WebViewer 时,它可以工作(API 11+)。
它甚至在硬件加速开启时也能工作
【讨论】:
只要 Webview 不可滚动,它就可以工作。 我需要在三星 S3 上强制软件渲染后设置背景颜色 webView.setBackgroundColor(Color.argb(1, 0, 0, 0));如果您不希望滚动时背景闪烁 @Trent 我试过你的方法,如果解决了果冻豆上的闪烁问题,但现在它在姜饼上显示黑色背景。还有其他建议吗? 这会禁用 webview 的硬件加速! !这对我来说并不明显(怪我在使用 :D 之前没有查看它),答案的最后一句话留下了相反的印象。这实际上会影响很多东西,视频、UI 转换、滚动、画布等。可能的解决方法***.com/a/17815574/2487876【参考方案8】:使用这个
WebView myWebView = (WebView) findViewById(R.id.my_web);
myWebView.setBackgroundColor(0);
【讨论】:
0 (0x00000000) = Color.TRANSPARENT 见developer.android.com/reference/android/graphics/…【参考方案9】:试试
webView.setBackgroundColor(Color.parseColor("#EDEDED"));
【讨论】:
【参考方案10】: 在尝试了上面给出的一切之后。我发现您在loadUrl()
/loadData()
之前或之后指定webView.setBackgroundColor(Color.TRANSPARENT)
都没有关系。
重要的是您应该在清单中明确声明android:hardwareAccelerated="false"
。
在冰淇淋三明治
上测试【讨论】:
【参考方案11】:这就是你的做法:
首先让你的项目基于 11,但在 AndroidManifest 中将 minSdkVersion 设置为 8
android:hardwareAccelerated="false" 不需要,和8不兼容
wv.setBackgroundColor(0x00000000);
if (Build.VERSION.SDK_INT >= 11) wv.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);
this.wv.setWebViewClient(new WebViewClient()
@Override
public void onPageFinished(WebView view, String url)
wv.setBackgroundColor(0x00000000);
if (Build.VERSION.SDK_INT >= 11) wv.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);
);
为了安全起见,请按照您的风格:
BODY, HTML background: transparent
在 2.2 和 4 上为我工作
【讨论】:
这对我有用:android:hardwareAccelerated="false" BODY, HTML background: transparent【参考方案12】:以下代码可以正常工作Android 3.0+,但是当您在 android 3.0 以下尝试此代码时,您的应用会被强制关闭。
webView.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);
您在少于 API 11 上尝试以下代码。
webview.setBackgroundColor(Color.parseColor("#919191"));
或者
您也可以尝试以下适用于所有API的代码。
webview.setBackgroundColor(Color.parseColor("#919191"));
if (Build.VERSION.SDK_INT >= 11)
webview.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);
上面的代码对我来说是完整的。
【讨论】:
我不建议你将LayerType设置为LAYER_TYPE_SOFTWARE。它会大大降低性能,尤其是在滚动时。【参考方案13】:只需使用这些行.....
webView.loadDataWithBaseURL(null,"Hello", "text/html", "utf-8", null);
webView.setBackgroundColor(0x00000000);
记住一点,在 webview 中加载数据后总是设置背景颜色。
【讨论】:
【参考方案14】:我试图在我的 GL 视图上放置一个透明的 HTML 覆盖,但它总是黑色闪烁,覆盖了我的 GL 视图。经过几天试图摆脱这种闪烁,我发现这种解决方法对我来说是可以接受的(但对于 android 来说是一种耻辱)。
问题是我的漂亮 CSS 动画需要硬件加速,所以 webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
不适合我。
诀窍是在我的 GL 视图和 HTML 覆盖之间放置第二个(空的)WebView
。我告诉这个dummyWebView
以 SW 模式渲染,现在我的 HTML 叠加层在 HW 中呈现平滑且不再有黑色闪烁。
我不知道这是否适用于除 My Acer Iconia A700 之外的其他设备,但我希望我能帮助某人。
public class MyActivity extends Activity
@Override
protected void onCreate(Bundle icicle)
super.onCreate(icicle);
RelativeLayout layout = new RelativeLayout(getApplication());
setContentView(layout);
MyGlView glView = new MyGlView(this);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
dummyWebView = new WebView(this);
dummyWebView.setLayoutParams(params);
dummyWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
dummyWebView.loadData("", "text/plain", "utf8");
dummyWebView.setBackgroundColor(0x00000000);
webView = new WebView(this);
webView.setLayoutParams(params);
webView.loadUrl("http://10.0.21.254:5984/ui/index.html");
webView.setBackgroundColor(0x00000000);
layout.addView(glView);
layout.addView(dummyWebView);
layout.addView(webView);
【讨论】:
我在 Galaxy Nexus 上进行了测试,但很遗憾,闪烁仍然存在。【参考方案15】:如果 webview 是可滚动的:
将此添加到清单中:
android:hardwareAccelerated="false"
或
在布局中的WebView中添加以下内容:
android:background="@android:color/transparent"
android:layerType="software"
将以下内容添加到父滚动视图:
android:layerType="software"
【讨论】:
【参考方案16】:webView.setBackgroundColor(0x00000000);
webView.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);
这肯定会奏效.. 使用 Editbackground 在 XML 中设置背景。 现在将显示背景
【讨论】:
【参考方案17】:没有提到最重要的事情。
html必须有一个body
标签,background-color
设置为transparent
。
所以完整的解决方案是:
HTML
<body style="display: flex; background-color:transparent">some content</body>
活动
WebView wv = (WebView) findViewById(R.id.webView);
wv.setBackgroundColor(0);
wv.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
wv.loadUrl("file:///android_asset/myview.html");
【讨论】:
问题中提到了。但这似乎是一个很好的简历,如果你想让它在所有 android 版本上工作,你必须做什么。【参考方案18】:这对我有用。加载数据后尝试设置背景颜色。对于您的 webview 对象上的 setWebViewClient,例如:
webView.setWebViewClient(new WebViewClient()
@Override
public void onPageFinished(WebView view, String url)
super.onPageFinished(view, url);
webView.setBackgroundColor(Color.BLACK);
);
【讨论】:
【参考方案19】:试用:
myWebView.setAlpha(0.2f);
【讨论】:
【参考方案20】:如果没有任何帮助,那么很可能您已经固定了 webView
的大小,将宽度和高度更改为 wrap_content 或 match_parent
,它应该可以工作。当我尝试加载 Gif 时,这对我有用。
【讨论】:
【参考方案21】:myWebView.setAlpha(0);
是最好的答案。有效!
【讨论】:
请解释原因。【参考方案22】:您可以像这样使用 BindingAdapter:
Java
@BindingAdapter("setBackground")
public static void setBackground(WebView view,@ColorRes int resId)
view.setBackgroundColor(view.getContext().getResources().getColor(resId));
view.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);
XML:
<layout >
<data>
<import type="com.tdk.sekini.R" />
</data>
<WebView
...
app:setBackground="@R.color.grey_10_transparent"/>
</layout>
资源
<color name="grey_10_transparent">#11e6e6e6</color>
【讨论】:
【参考方案23】:这没用,
android:background="@android:color/transparent"
将webview
背景颜色设置为工作状态
webView.setBackgroundColor(0)
另外,我将可绘制的窗口背景设置为透明
【讨论】:
以上是关于Android WebView 样式背景颜色:在 android 2.2 上忽略透明的主要内容,如果未能解决你的问题,请参考以下文章