Android上的动画Bug?
这很难解释,但我们开始吧 好的,在我得到动画放置的片段之前的转换是: MainActivity(扩展活动)->loginActivity(扩展活动)->现在我调用:Android上的动画Bug?,android,android-fragments,android-animation,Android,Android Fragments,Android Animation,这很难解释,但我们开始吧 好的,在我得到动画放置的片段之前的转换是: MainActivity(扩展活动)->loginActivity(扩展活动)->现在我调用: Intent homeIntent = new Intent(loginActivity.this, HomeActivity.class); Bundle bundle = new Bundle(); bundle.putSerializable("risposta",(Serializable)risposta); homeIn
Intent homeIntent = new Intent(loginActivity.this, HomeActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("risposta",(Serializable)risposta);
homeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // read below (StackOverFlow)
homeIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); // read below (StackOverFlow)
homeIntent.putExtras(bundle);
startActivity(homeIntent);
它启动了HomeActivity,扩展了FragmentActivity,并在onCreateView()的末尾添加了我的片段循环片段,该片段@覆盖了onResume()
:
或XML(两者都尝试):
发生了什么事?
有时效果不好(有时很好!):它开始在(50%,25%)(或0.5,0.25%)附近,不完全是(经过计算的),但如果我让屏幕关闭并恢复,一切都会恢复正常:O
为什么奇怪?
您是否看到两行注释,它们清除任务并在顶部启动活动?
如果我不设定,一切都好
如果我以MainActivity->HomeActivity和doing finish(而不是清除任务)的形式启动它,它也可以正常工作
发生了什么事
提前感谢。当你听到诸如“有时效果不好”之类的说法时,不要低估这一点。这基本上意味着可能涉及到时间成分。由于多线程操作的执行顺序不一定是已知的,因此在不同的CPU/GPU负载之前或之后和/或期间可能会发生THINK。同时,提前几毫秒可能意味着还有一些事情还没有完成,我们可能需要完成一些事情,或者可能是“密集的”
在Android活动/片段生命周期中,“或多或少”都保证按一定顺序发生
如果你有时或多或少地加上,,,你就有了不可知的秘诀
我没有尝试过您的特定场景,但我推荐以下步骤:
除非布局已经布置好,否则不要设置动画。你必须等待李>
除非已创建视图,否则不要设置动画。你不能:D
因此,即使“有时效果很好”,我也怀疑你的“有时”是因为你在视图未完成时设置动画太早了。不要将已经令人困惑的方法名onCreatedView
与“是的,视图已经创建并布局好了”混淆。创建!=布置好了
那么,什么时候才能看到这幅图呢
当安卓完成大量的测量和绘图时
我们怎么知道
通过使用你今天看到的最丑陋的代码
示例(在片段中):
现在您需要标记mViewHasBeenCreated…或者您可以检查mRadar!=null
而不是仅使用信号量
继续我的例子
// Define this flag too, because things are asynchronous we don't know who's gonna happen first!
private volatile boolean mViewHasBeenCreated = false;
在您的:
@Override
public void onViewCreated(final View view, final Bundle savedInstanceState) {
mViewHasBeenCreated = true;
super.onViewCreated(view, savedInstanceState);
}
在你的简历中:
boolean mRadarHasBeenAnimated = false; //flag to avoid multiple animations.
@Override
public void onResume() {
super.onResume();
if ( mRootLayoutComplete && mViewHasBeenCreated && !mRadarHasBeenAnimated ) {
animate(mRadar); // could also check for null here
}
}
和动画:
void animate(final View view) {
if ( view == null ) {
return;
}
// your animation code
view.animate(youranimation);
mRadarHasBeenAnimated = true;
}
最后,如果你想在每次恢复时设置“雷达”的动画,那么你必须重置这个
@Override
public void onPause() {
super.onPause();
mRadarHasBeenAnimated = false;
}
这应该能奏效
基本上,只有在满足某些条件(特别是mRootLayoutComplete)后,才可以设置视图的动画,所有标志都是为了避免多次运行视图,尤其是在创建过程中。因为你不知道哪一个会先发生,你需要“等待”,只有在你确信你能做到的时候才去做
祝你好运
p、 d:我还没有测试过上面的代码,但我已经在很多应用程序中使用过这个技巧,而且一直都很有效 雷达对象是什么?它是一个视图,在本例中是一个图像视图。您正在启动一个活动,其中包含一个片段。然后,片段
想要为视图设置动画,这是否正确?是的,正确。我开始在片段的onResume
上制作动画嗨,谢谢,这是一个明智的答案。我试过了,但没有成功:\但是从你的回答来看,我考虑过不设置ImageView,我创建了,我将它设置为params:MATCH_PARENT,MATCH_PARENT,然后设置动画。两者都不起作用。它没有意义,如果我将动画设置为50%轴,并在将视图添加到容器后设置动画,那么它应该可以工作。
boolean mRadarHasBeenAnimated = false; //flag to avoid multiple animations.
@Override
public void onResume() {
super.onResume();
if ( mRootLayoutComplete && mViewHasBeenCreated && !mRadarHasBeenAnimated ) {
animate(mRadar); // could also check for null here
}
}
void animate(final View view) {
if ( view == null ) {
return;
}
// your animation code
view.animate(youranimation);
mRadarHasBeenAnimated = true;
}
@Override
public void onPause() {
super.onPause();
mRadarHasBeenAnimated = false;
}