Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android上的动画Bug?_Android_Android Fragments_Android Animation - Fatal编程技术网

Android上的动画Bug?

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

这很难解释,但我们开始吧

好的,在我得到动画放置的片段之前的转换是:

MainActivity(扩展活动)->loginActivity(扩展活动)->现在我调用:

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;
    }