我已经为此困扰了很长一段时间了。我正在尝试将包含在 FrameLayout 中的片段向右移动,以便只有左侧 20% 的片段可见。
我认为我遇到的问题是父级不会让片段移动到其边界之外,或者我不知道如何移动它。我所尝试的一切都只是将片段推到右墙上,并缩放片段以适应。我需要它把碎片推到右墙外。任何帮助将不胜感激。
我想要达到的最终效果是,当你按下一个穿上片段时,片段会转换为全视图,然后按下按钮会转换回 20% 的视图。我已经设置好了动画,只是片段的实际移动让我很难过。
我已经为此困扰了很长一段时间了。我正在尝试将包含在 FrameLayout 中的片段向右移动,以便只有左侧 20% 的片段可见。
我认为我遇到的问题是父级不会让片段移动到其边界之外,或者我不知道如何移动它。我所尝试的一切都只是将片段推到右墙上,并缩放片段以适应。我需要它把碎片推到右墙外。任何帮助将不胜感激。
我想要达到的最终效果是,当你按下一个穿上片段时,片段会转换为全视图,然后按下按钮会转换回 20% 的视图。我已经设置好了动画,只是片段的实际移动让我很难过。
这意味着虽然它有动画效果,但这并不意味着片段本身就是动画让它看起来的地方。在物理移动之前,它仍会在原始位置接收 OnClick 事件。
您可能正在使用旧式动画(例如TranslateAnimation
),它们是为瞬态效果而不是永久效果而设计的。
我向您指出我的一个相关问题的原因是许多解决方案,包括我自己的解决方案,都使用了新的动画框架,该框架专为更持久的效果而设计。
该示例也对我没有帮助,我试图将其部分移出屏幕,而不仅仅是将其挤在边缘上。
特别是对于动画师框架,“将其部分移出屏幕”和“将其挤在边缘”之间没有实质性区别。例如,如果您阅读了我的解决方案,您会看到一个translateWidgets()
演示一组小部件的水平幻灯片的方法:
private void translateWidgets(int deltaX, View... views) {
for (final View v : views) {
v.setLayerType(View.LAYER_TYPE_HARDWARE, null);
v.animate().translationXBy(deltaX).setDuration(ANIM_DURATION)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
v.setLayerType(View.LAYER_TYPE_NONE, null);
}
});
}
}
在您的情况下,deltaX
将是任何适当的值来实现您的 20% 效果(大概0.2f
是容器宽度的倍数,或沿着这些线),或者在应该看到完整片段时撤消该效果。
我的答案包含指向完整示例项目的链接,既适用于原生 API 级别 11 动画师,也适用于动画师框架的 NineOldAndroids 反向移植。