java场景转换滞后于viewflipper

wd2eg0qa  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(379)

我有一个 ViewFlipper 这基本上类似于有人删除并键入文本(即删除当前存在的单词并键入其他内容),在同一个活动中,我有一个浮动操作按钮,按下时会显示一些图标,允许用户单击以转到某些网站(github链接、youtube链接、instagram链接等)。但是,当按下浮动操作按钮时,它使用 AutoTransition (淡入淡出)过渡到下一个 Scene (可点击图标)。这一转变滞后于我的计划 ViewFlipper (它正在制造 ViewFlipper 停顿一下,然后很快“打字”。
一些可能的问题:
这个 ViewFlipper 文本使用 Html.fromHtml() 格式化文本(我需要的文本部分是粗体和不同的颜色。为了解决这个问题,我可以使用一种更快的方式来呈现文本。有人对此有什么建议吗?
两者之间的过渡 Scene s也可能太慢。但是,我不知道怎么解决这个问题。
到目前为止,我已经尝试禁用 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);
});

感谢任何能帮忙的人!
编辑-我现在尝试使用如何提高viewflipper/viewanimator的性能的答案,它使用 android:measureAllChildren="false" . 这解决了滞后的问题,但现在当我使用动画时,它有时会使整个 ViewFlipper 闪一下,然后再闪一下。

hrysbysz

hrysbysz1#

耶!经过几天的周旋,我解决了我的问题。首先,我用 android:measureAllChildren="false" 解决问题 ViewFlipper 滞后问题。之后,不用安卓内置 AutoTransition 过渡 Scene s、 我创造了我自己的 FadeIn 以及 FadeOut 动画,以及 FrameLayout.startAnimation(Animation); 制作动画。这有助于我控制动画时间和停止延迟。

相关问题