场景转换滞后于 ViewFlipper
Scene transition is lagging out ViewFlipper
我有一个 ViewFlipper
基本上类似于某人删除和输入文本(即删除当前存在的单词并输入其他内容),并且在同一个 activity 我有一个浮动动作按钮,按下时会显示一些图标,允许用户单击以转到某些网站(GitHub link、YouTube link、Instagram link 等) .但是,当按下浮动操作按钮时,它会使用 AutoTransition
(淡入、淡出)过渡到下一个 Scene
(可点击图标)。此转换滞后于我的 ViewFlipper
(它使 ViewFlipper
暂停一会儿,然后非常快速地“输入”。
一些可能的问题:
ViewFlipper
文本使用 Html.fromHtml()
格式化文本(我需要部分文本为粗体和不同的颜色。要解决此问题,我可以使用更快的方式来呈现文本. 有人对此有什么建议吗?
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>︳ <br>" + finalPhrase;
String second = "<b>" + boldedName + "</b>\nis a" + (an ? "n" : "") + "<br>" +
"<font color=\"#fafafa\">︳</font><i>" + word +
"</i><font color=\"#fafafa\">︳ </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>︳ <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>︳ <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>︳ <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 内置的 AutoTransition
在 Scene
之间转换,而是创建了自己的 FadeIn
和 FadeOut
动画,并使用 FrameLayout.startAnimation(Animation);
动画。这帮助我既控制了动画时间又停止了延迟。
我有一个 ViewFlipper
基本上类似于某人删除和输入文本(即删除当前存在的单词并输入其他内容),并且在同一个 activity 我有一个浮动动作按钮,按下时会显示一些图标,允许用户单击以转到某些网站(GitHub link、YouTube link、Instagram link 等) .但是,当按下浮动操作按钮时,它会使用 AutoTransition
(淡入、淡出)过渡到下一个 Scene
(可点击图标)。此转换滞后于我的 ViewFlipper
(它使 ViewFlipper
暂停一会儿,然后非常快速地“输入”。
一些可能的问题:
ViewFlipper
文本使用Html.fromHtml()
格式化文本(我需要部分文本为粗体和不同的颜色。要解决此问题,我可以使用更快的方式来呈现文本. 有人对此有什么建议吗?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>︳ <br>" + finalPhrase;
String second = "<b>" + boldedName + "</b>\nis a" + (an ? "n" : "") + "<br>" +
"<font color=\"#fafafa\">︳</font><i>" + word +
"</i><font color=\"#fafafa\">︳ </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>︳ <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>︳ <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>︳ <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 内置的 AutoTransition
在 Scene
之间转换,而是创建了自己的 FadeIn
和 FadeOut
动画,并使用 FrameLayout.startAnimation(Animation);
动画。这帮助我既控制了动画时间又停止了延迟。