android - 对话框动画被 webview : android bug? 弄乱了

标签 android android-webview android-animation android-alertdialog

我制作了一个带有进入和退出慢速动画的对话框。但是对话框包含一个 webview myMsg (加载本地文件,所以没有延迟)并弄乱了动画。

使用下面的代码(无 webview),对话框可以完美运行,在 Enter 和 Exit 时都具有动画效果。但是,如果我取消注释 线 //builder.setView(myMsg) ,退出动画仍然完美运行,但不执行输入动画(或执行得太快)。有趣的是,如果我最小化应用程序并再次最大化它,Enter 对话框动画执行得很好。

这就像 webview 加载弄乱了 Enter 动画。我尝试在加载 webview 后显示对话框,结果相同。

这不是疯了吗?关于正在发生的事情以及如何解决的任何线索?任何帮助将不胜感激。

这是代码的相关部分:

    WebView myMsg = new WebView(context);
    myMsg.loadUrl("file:///android_asset/page.html");

    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setIcon(R.drawable.ic_launcher);
    //builder.setView(myMsg);
    builder.setTitle("Some Title");
    final AlertDialog dialog = builder.create();

    WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
    lp.windowAnimations = R.style.AnimateDialog;

    dialog.show();
    dialog.getWindow().setAttributes(lp);

在风格上,

<style name="AnimateDialog">
    <item name="android:windowEnterAnimation">@anim/in_left</item>
    <item name="android:windowExitAnimation">@anim/out_left</item>
</style>

编辑

我试过 setWebViewClient , 但运气不好(没有行 dialog.getWindow().setLayout... Enter 动画根本不起作用):

    WebView myMsg = new WebView(context);
    myMsg.getSettings().setJavaScriptEnabled(true);
    myMsg.loadUrl("file:///android_asset/" + page);
    myMsg.setBackgroundColor(0);
    myMsg.setSoundEffectsEnabled(true);

    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setIcon(R.drawable.ic_launcher);
    builder.setTitle("SomeTitle");
    builder.setView(myMsg);
    final AlertDialog dialog = builder.create();

    myMsg.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            dialog.show();
            dialog.getWindow().setWindowAnimations(R.style.AnimateDialog);
            dialog.getWindow().setLayout(WindowManager.LayoutParams.FILL_PARENT, WindowManager.LayoutParams.FILL_PARENT);
        }
    }

EDIT2

我还尝试使用 Dialog 而不是 AlertDialog,使用 xml 布局,遇到相同的问题(也尝试使用 WebView.loadData 而不是 WebView.loadUrl,同样的问题):

    final Dialog d = new Dialog(context);
    d.setContentView(R.layout.viewhtml);
    d.setTitle("SomeTitle");
    // Without this, Enter animation does not work
    d.getWindow().setLayout(WindowManager.LayoutParams.FILL_PARENT,
            WindowManager.LayoutParams.FILL_PARENT);
    WebView wv = (WebView) d.findViewById(R.id.webview);
    wv.loadUrl("file:///android_asset/" + page);
    wv.setBackgroundColor(0);
    d.getWindow().setWindowAnimations(R.style.AnimateDialog);
    wv.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            d.show();
        }
    });

这是对话框 xml 布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

<WebView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/webview"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:soundEffectsEnabled="true" >
</WebView>

</LinearLayout>

EDIT3

我刚刚意识到使用 TextView 时会发生同样的问题与 TextView.setText(Html.fromHTML...)而不是 WebView .此外,如果我添加 dialog.getWindow().setLayout(600,800) 之后 dialog.show() ,动画按预期执行。所以问题似乎是在事先不知道对话框大小的情况下不执行动画?

最佳答案

我有一个类似的问题,但我不想放置动画,而是想禁用它,因为它扰乱了我的带有 WebView 的对话框的明显加载时间。我实际上能够禁用主窗口动画 Enter/Exit 因为它不再淡入/淡出但问题是 WebView 的内容大部分时间被 Dialog 的 Slide 动画延迟,我也在尝试禁用(我真的认为如果禁用窗口动画,所有动画都应该被禁用)。

根据我的测试,这实际上是一个 Jellybean 错误,但它在 Android 4.3 中最为明显,额外的动画弄乱了我的弹出窗口。不过 ICS 没有问题。

如果您尝试通过 Android 设置 -> 开发人员选项 -> 窗口动画比例增加默认动画时间,比如增加到 5 甚至 10,您会注意到内容现在显示得更晚了。但是如果关闭动画,显示会很快。我相信如果禁用默认动画,您的动画也可能会起作用。

我认为这种行为是一个 Jelly bean 错误,它仅在您在对话框中使用 WebView 时才会出现。该对话框将 WebView 内容放在动画时间之后,即使它应该已经被禁用,因为它随着高度的增长而滑动它。

我尝试的另一种解决方案是缓存对话框,以便可以重复使用它。我的问题消失了,但有时无法根据实际的 HTML 内容正确调整大小。现在,如果您的内容在显示时的长度基本相同,您可以只缓存您的对话框。

我希望我已经给了你很多线索。

关于android - 对话框动画被 webview : android bug? 弄乱了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17937663/

相关文章:

android - 我的应用程序依赖于您的设备不支持的 Google Play 服务。联系制造商寻求帮助

android - 如果我发布的 apk 更新了,google play 会通知用户吗……???怎么做?

android - 嵌入线性布局的 Webview 不会上下滚动,只能左右滚动

react-native - React Native Android WebView Vimeo 播放器控制栏消失

android - 为什么进入动画在新线程中不起作用?

java - 在 Java 中设置 android 动画的插值器

android - 如何在从url加载的ImageView中淡入图片

android - Firebase Auth 使用 Google 登录无法正常工作

android media player 显示音频但没有视频

android - 放大移动网站和网页 View