场景转换滞后于 ViewFlipper

Scene transition is lagging out ViewFlipper

我有一个 ViewFlipper 基本上类似于某人删除和输入文本(即删除当前存在的单词并输入其他内容),并且在同一个 activity 我有一个浮动动作按钮,按下时会显示一些图标,允许用户单击以转到某些网站(GitHub link、YouTube link、Instagram link 等) .但是,当按下浮动操作按钮时,它会使用 AutoTransition(淡入、淡出)过渡到下一个 Scene(可点击图标)。此转换滞后于我的 ViewFlipper(它使 ViewFlipper 暂停一会儿,然后非常快速地“输入”。

一些可能的问题:

  1. ViewFlipper 文本使用 Html.fromHtml() 格式化文本(我需要部分文本为粗体和不同的颜色。要解决此问题,我可以使用更快的方式来呈现文本. 有人对此有什么建议吗?
  2. Scene 之间的转换也可能太慢。但是,我不知道解决这个问题的方法。

到目前为止,我已经尝试禁用 AutoTransition,这很有效,但它使按钮的使用变得非常尴尬和不舒服。我已经尝试搜索这个问题,但我找不到任何东西。

这是我的 ViewFlipper:

代码
public void inflateViewFlipper(String boldedName, String finalPhrase, String... words) {
    if (words.length == 0) return;
    ViewFlipper vf = findViewById(R.id.heading_flipper);
    vf.removeAllViews();
    // Vowels, determining whether to use "a" or "an":
    Set<Character> vowels = new HashSet<>();
    vowels.add('a');
    vowels.add('e');
    vowels.add('i');
    vowels.add('o');
    vowels.add('u');
    vowels.add('A');
    vowels.add('E');
    vowels.add('I');
    vowels.add('O');
    vowels.add('U');
    for (int i = 0; i < words.length; i++) {
        String word = words[i];
        boolean an = vowels.contains(word.charAt(0));
        String first = "<b>" + boldedName + "</b>\nis a" + (an ? "n" : "") + "<br>" +
                "<font color=\"#fafafa\">︳</font><i>" + word + "</i>︳&#8202<br>" + finalPhrase;
        String second = "<b>" + boldedName + "</b>\nis a" + (an ? "n" : "") + "<br>" +
                "<font color=\"#fafafa\">︳</font><i>" + word +
                "</i><font color=\"#fafafa\">︳&#8202</font><br>" + finalPhrase;
        if (i > 0) {
            // "Typing" the adjective:
            for (int j = 0; j <= word.length(); j++) {
                String cut = word.substring(0, j);
                String newText = "<b>" + boldedName + "</b>\nis a" + (an ? "n" : "") + "<br>" +
                        "<font color=\"#fafafa\">︳</font><i>"
                        + cut + "</i>︳&#8202<br>" + finalPhrase;
                TextView tv = new TextView(this);
                tv.setGravity(Gravity.CENTER);
                tv.setText(Html.fromHtml(newText, Html.FROM_HTML_MODE_LEGACY));
                tv.setTextSize(30);
                tv.setTextColor(Color.BLACK);
                vf.addView(tv);
            }
        }
        // Wait for a few seconds, cursor flashing to represent real cursors:
        for (int j = 0; j < 3; j++) {
            for (int k = 0; k < 5; k++) {
                TextView tv = new TextView(this);
                tv.setGravity(Gravity.CENTER);
                tv.setText(Html.fromHtml(first, Html.FROM_HTML_MODE_LEGACY));
                tv.setTextSize(30);
                tv.setTextColor(Color.BLACK);
                vf.addView(tv);
            }
            for (int k = 0; k < 5; k++) {
                TextView tv = new TextView(this);
                tv.setGravity(Gravity.CENTER);
                tv.setText(Html.fromHtml(second, Html.FROM_HTML_MODE_LEGACY));
                tv.setTextSize(30);
                tv.setTextColor(Color.BLACK);
                vf.addView(tv);
            }
        }
        for (int j = 0; j < 5; j++) {
            TextView tv = new TextView(this);
            tv.setGravity(Gravity.CENTER);
            tv.setText(Html.fromHtml(first, Html.FROM_HTML_MODE_LEGACY));
            tv.setTextSize(30);
            tv.setTextColor(Color.BLACK);
            vf.addView(tv);
        }
        for (int j = word.length(); j > 0; j--) {
            String cut = word.substring(0, j);
            String newText = "<b>" + boldedName + "</b>\nis a" + (an ? "n" : "") + "<br>" +
                    "<font color=\"#fafafa\">︳</font><i>" +
                    cut + "</i>︳&#8202<br>" + finalPhrase;
            TextView tv = new TextView(this);
            tv.setGravity(Gravity.CENTER);
            tv.setText(Html.fromHtml(newText, Html.FROM_HTML_MODE_LEGACY));
            tv.setTextSize(30);
            tv.setTextColor(Color.BLACK);
            vf.addView(tv);
        }
        if (i == words.length - 1) {
            // "Deleting" the text:
            word = words[0];
            an = vowels.contains(word.charAt(0));
            for (int j = 0; j <= word.length(); j++) {
                String cut = word.substring(0, j);
                String newText = "<b>" + boldedName + "</b>\nis a" + (an ? "n" : "") + "<br>" +
                        "<font color=\"#fafafa\">︳</font><i>"
                        + cut + "</i>︳&#8202<br>" + finalPhrase;
                TextView tv = new TextView(this);
                tv.setGravity(Gravity.CENTER);
                tv.setText(Html.fromHtml(newText, Html.FROM_HTML_MODE_LEGACY));
                tv.setTextSize(30);
                tv.setTextColor(Color.BLACK);
                vf.addView(tv);
            }
        }
    }
    // Starting the ViewFlipper:
    vf.onFinishTemporaryDetach();
    vf.invalidate();
    vf.showNext();
    vf.setFlipInterval(10);
    vf.startFlipping();
}

基本上,我想做的是输入一个形容词列表来表示某物是什么,例如: Noun <-(bolded) is a(n) (insert adjective) <-(italicized)(text cursor) (Noun)。例如,“我的公司 是一项惊人的 消息服务”。

我的 Scene 转换只是一个 AutoTransition,没什么特别的:

showPopup.setOnClickListener(v -> {
    TransitionManager.go(socialMedia);
    // Switching the buttons:
    showPopup.setVisibility(View.GONE);
    closePopup.setVisibility(View.VISIBLE);
});

感谢任何能提供帮助的人!

编辑 - 我现在尝试使用来自 How to improve the performance of ViewFlipper/ViewAnimator 的答案,它使用的是 android:measureAllChildren="false"。这解决了滞后问题,但现在当我使用动画时,它有时会使整个 ViewFlipper 闪烁然后再次闪烁。

耶!经过几天的摸索,我解决了我的问题。首先,我使用 android:measureAllChildren="false" 来解决 ViewFlipper 滞后问题。在那之后,我没有使用 Android 内置的 AutoTransitionScene 之间转换,而是创建了自己的 FadeInFadeOut 动画,并使用 FrameLayout.startAnimation(Animation); 动画。这帮助我既控制了动画时间又停止了延迟。