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();