我有一个 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>︳ <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);
});
感谢任何能帮忙的人!
编辑-我现在尝试使用如何提高viewflipper/viewanimator的性能的答案,它使用 android:measureAllChildren="false"
. 这解决了滞后的问题,但现在当我使用动画时,它有时会使整个 ViewFlipper
闪一下,然后再闪一下。
1条答案
按热度按时间hrysbysz1#
耶!经过几天的周旋,我解决了我的问题。首先,我用
android:measureAllChildren="false"
解决问题ViewFlipper
滞后问题。之后,不用安卓内置AutoTransition
过渡Scene
s、 我创造了我自己的FadeIn
以及FadeOut
动画,以及FrameLayout.startAnimation(Animation);
制作动画。这有助于我控制动画时间和停止延迟。