我已经实现了一个横幅,每当用户失去连接时就会弹出。重新连接后,另一个横幅会显示几秒钟然后消失。
布局是一个RelativeLayout,其中一个灰色的TextView 表示警告*,一个绿色的TextView 表示重新连接消息。
如果我只是更改 Visibility.GONE 和 Visibility.VISIBLE,一切都会正常。
但我想做得更漂亮,所以我添加了一些动画。我这里遇到了一个奇怪的问题。在第一次执行中,一切都按预期进行。后续执行无法正常工作。
我想在重新连接时同时为两个文本视图设置动画。因此,灰色文本视图淡出,而绿色文本视图淡入(两者同时)。仅在第一次执行时才有效。下次它顺序执行时:首先灰色文本视图淡出,然后绿色文本视图淡入。我不希望它顺序执行。
我已将视频上传到 Youtube(30 秒),以便您可以看到效果。先是工作,然后就不行了。观看此内容比阅读我的描述更容易:https://youtu.be/rD1ZNzKen0U
交叉淡入淡出方法是所有魔法发生的地方。如您所见,view.animate() 在两个线程内调用。最初我实现了完全相同的代码,但没有线程,因为 animate() 方法应该是异步的。但我对这个问题很恼火,所以我尝试这样做。我还尝试在设置每个动画之前执行 view.clearAnimations() 。但什么也没有。
private void crossfade() {
final int animationDuration = 600;
// Set the view to 0% opacity but visible, so that it is visible (but fully transparent) during the animation.
bannerNetworkConnected.setAlpha(0f);
bannerNetworkConnected.setVisibility(View.VISIBLE);
bannerNetworkDisconnected.animate()
.alpha(0f)
.setDuration(animationDuration)
.setListener(null);
bannerNetworkConnected.animate()
.alpha(1f)
.setDuration(animationDuration)
// .setListener(null);
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
dissapearFadding();
}
});
flipper.stopFlipping();
}
Run Code Online (Sandbox Code Playgroud)
关闭重新连接的横幅的方法:
private void dissapearFadding() {
bannerNetworkConnected.animate()
.alpha(0f)
.setDuration(300)
.setStartDelay(1500)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
bannerNetworkDisconnected.setVisibility(View.GONE);
container.setVisibility(View.GONE);
bannerNetworkConnected.setVisibility(View.GONE);
}
});
}
Run Code Online (Sandbox Code Playgroud)
网络交换接收器:
public void networkStateChange(boolean connected) {
Log.i(MainActivity.TAG, "MainActivity.networkStateChange() " + connected);
//bannerNetworkDisconnected.setVisibility(connected ? View.GONE : View.VISIBLE);
if (bannerNetworkDisconnected != null && bannerNetworkConnected != null) {
bannerNetworkDisconnected.clearAnimation();
bannerNetworkConnected.clearAnimation();
if (!connected) {
appearFromTop();
} else if (connected && bannerNetworkDisconnected.getVisibility() == View.VISIBLE) {
crossfade();
} else {
container.setVisibility(View.GONE);
bannerNetworkConnected.setVisibility(View.GONE);
bannerNetworkDisconnected.setVisibility(View.GONE);
flipper.stopFlipping();
}
}
}
Run Code Online (Sandbox Code Playgroud)
横幅 XML:
<RelativeLayout
android:id="@+id/banner_network_container"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:visibility="gone">
<TextView
android:id="@+id/banner_network_disconnected"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="No connection. Retrying..."
android:textColor="#F0F0F0"
android:visibility="gone"/>
<TextView
android:id="@+id/banner_network_connected"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#44bb44"
android:text="Reconnected!"
android:textColor="#F0F0F0"
android:visibility="gone"/>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
我创建了一个新项目并复制了所有代码,但问题仍然存在。如果你想检查这里的整个类,你可以在 github 上找到整个项目: https: //github.com/rolgalan/NetworkBanner
我真的很感谢对此的任何帮助,因为我现在花了太多时间来解决这个问题,而且我快疯了。这真的很奇怪,因为它实际上执行了两个动画……但是一个接一个地执行,而不是像第一次执行那样并行执行。
*实际上,警告横幅比简单的 TextView (LinearLayout) 更复杂一些,因为我想要“重试...”文本的闪烁效果。但我们不应该关心这个。
(对我来说)这很有趣,因为我几分钟前刚刚回答了另一个问题,该问题与您的问题完全相同:
请从这里阅读我的答案: Why does running a secondary viewpropertyanimation on a view Break theAnimation Listener?
所以根据我在那里的解释,修复很简单:
.setStartDelay(0) crossFade() -> bannerNetworkConnected.animate()所以它会重置延迟并且它们可以一起运行。
| 归档时间: |
|
| 查看次数: |
2752 次 |
| 最近记录: |