Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.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
Java 平移动画会导致视图中的更改';s填充位置,但不在布局中_Java_Android_Android Layout_Android Fragments_Android Animation - Fatal编程技术网

Java 平移动画会导致视图中的更改';s填充位置,但不在布局中

Java 平移动画会导致视图中的更改';s填充位置,但不在布局中,java,android,android-layout,android-fragments,android-animation,Java,Android,Android Layout,Android Fragments,Android Animation,我试图创建一个动画,其中一个LinearLayout上升(TranslateAnimation),而LinearLayout中的片段变为另一个片段(fadein/fadeout) 我设法让它完美地工作,但唯一的问题是LinearLayout的布局保持在相同的位置(尽管“填充”确实上升并保持不变)。 这导致我无法单击片段内部LinearLayout先前位置之外的任何视图 如何使布局“上移”以匹配填充的新位置 当前动画逻辑 具有布局边界的图像 编辑1:启动动画前布局的图像 编辑2:为达到预期效果

我试图创建一个动画,其中一个
LinearLayout
上升(
TranslateAnimation
),而
LinearLayout
中的片段变为另一个片段(fadein/fadeout)

我设法让它完美地工作,但唯一的问题是
LinearLayout
的布局保持在相同的位置(尽管“填充”确实上升并保持不变)。 这导致我无法单击片段内部
LinearLayout
先前位置之外的任何视图

如何使布局“上移”以匹配填充的新位置

当前动画逻辑 具有布局边界的图像

编辑1:启动动画前布局的图像

编辑2:为达到预期效果而进行的另一次试验 animation.setAnimationListener(新的TranslateAnimation.AnimationListener(){


这也不起作用。

如果需要在动画完成后使视图消失,则只需在动画完成时将可见性设置为消失:

animation.setAnimationListener(new TranslateAnimation.AnimationListener() 
        {           
            @Override
            public void onAnimationStart(Animation animation) { }

            @Override
            public void onAnimationRepeat(Animation animation) { }

            @Override
            public void onAnimationEnd(Animation animation) 
            {           
                mLL.setVisibility(View.GONE);
            }
        });

如果你只需要让它移动一点,那么在动画完成后,试着调整它的布局参数(边距),而不是仅仅改变可见性。

最后,我成功地实现了我想要的结果,虽然不是完美的。然后我想出了另一个解决方案,这项工作做得很完美,但需要做出牺牲。呵呵

解决方案#1 我只是简单地使用了
LinearLayout.offsetTopAndBottom(int)
,其中的参数与您提供的
TranslateAnimation
对象的像素数量相同。
还请注意,要使其工作,必须设置
animation.setFillBefore(true)
NOT
。setFillBefore(true)

此解决方案的问题在于,当视图实际被推上时,动画末尾会出现闪烁。
我不确定,但我也认为当键盘打开时,它会奇怪地移动,从而使此解决方案非常有效。我建议仅在满足动画流动性方面的需要时使用它,并且仅在没有任何
EditText
视图或任何其他需要视图的输入的视图上使用

我认为事情是
TranslateAnimation
移动像素(或视图的填充),而不是视图本身,这就是我一开始感到困惑的原因

解决方案#2 然而,我真正的解决方案(也是第二个解决方案)是切换到
ObjectAnimator
,而不是常规的
Animation
对象,并为视图的
translateY
属性设置动画。
它现在的工作方式与我所希望的一样,没有打嗝,没有闪烁,键盘没有问题,编辑视图(如
EditText
)也没有问题

不幸的是,
ObjectAnimator
仅在API11+中受支持,但您可以在上找到与api兼容的较低版本

就我个人而言,这让我想知道到底有多少运行API 8的设备?
显然,在写下这个答案(2014年7月10日)时,全世界只有13.5%的android设备运行它,而且这个数字只会随着时间的推移而减少

考虑到这一点,我决定在我的应用程序中只支持API 11+,因为在该版本中添加了许多对我至关重要的功能,我认为没有理由通过使用变通方法和混合库使应用程序与API 8兼容而使构建应用程序的过程变得更加困难。
节省了大量的时间和抓头

下面是一些代码,演示如何使用
ObjectAnimator
进行翻译动画:

        final int AmountToMove = -(desiredHeight - mLL.getHeight());
        ObjectAnimator objAnim = ObjectAnimator.ofFloat(mLL, "translationY", AmountToMove);
        
        objAnim.setDuration(1000);
        objAnim.setInterpolator(new OvershootInterpolator());
        
        objAnim.start();
请注意,这只是我自己的个人意见,它考虑了我的特定应用程序及其目标受众。在做出任何鲁莽决定之前,我建议权衡利弊,并根据自己的需要做出决定


最后一件事,请您也喜欢另一个答案(由Gil编写),因为它帮助我提出了第一个解决方案,我对此表示感谢(我也会将其标记为所选答案,但我不想混淆或误导具有相同问题/困惑的其他用户).

您的侦听器是否正确设置了EditText?同时,请确保动画在触摸视图之前结束,因为setFillAfter已启用。嗯,老实说,我没有为EditText编写任何代码。当我触摸略低于水平紫色线的位置时,键盘会弹出。此外,我尝试在触摸之前等待动画结束或者尝试任何东西…感谢您的评论!嗨,吉尔,谢谢您的回答!我不想在动画结束时视图消失,但我尝试了您更改视图最终布局的方法。我在启动动画之前添加了另一个图像,这可能会澄清我面临的问题:)。需要明确的是,当视图在其动画结束时,顶部部分是否在父布局之外?是的,第一个附加图像中以黑色圈出的部分。我正在动画的是具有白色背景的视图。(我假设这也是您所称的父布局)
animation.setAnimationListener(new TranslateAnimation.AnimationListener() 
        {           
            @Override
            public void onAnimationStart(Animation animation) { }

            @Override
            public void onAnimationRepeat(Animation animation) { }

            @Override
            public void onAnimationEnd(Animation animation) 
            {           
                mLL.setVisibility(View.GONE);
            }
        });
        animation.setFillBefore(true);

        animation.setAnimationListener(new TranslateAnimation.AnimationListener() {
            
            @Override
            public void onAnimationStart(Animation animation) {
                // TODO Auto-generated method stub
                
            }
            
            @Override
            public void onAnimationRepeat(Animation animation) {
                // TODO Auto-generated method stub
                
            }
            
            @Override
            public void onAnimationEnd(Animation animation) {
                mLL.offsetTopAndBottom(AmountToMove);
            }
        });
        final int AmountToMove = -(desiredHeight - mLL.getHeight());
        ObjectAnimator objAnim = ObjectAnimator.ofFloat(mLL, "translationY", AmountToMove);
        
        objAnim.setDuration(1000);
        objAnim.setInterpolator(new OvershootInterpolator());
        
        objAnim.start();