所以,我正在尝试使用动画,到目前为止,这是一个非常令人头疼的问题。我在这里尝试做的也与我通常看到的有所不同。
场景是我在 Activity 启动时使用 FragmentTransactions 为 ListFragment 充气。当我单击一个列表项时,我希望该项目滚动到屏幕顶部,以便它的顶部触及操作栏的底部。不仅如此,我还希望列表项的底部扩展到屏幕底部。在执行所有这些操作的同时,我想在列表项下现在展开的区域中使用 FragmentTransactions 添加另一个 ListFragment。父 ListView 应该是不可滚动的,但仍然可以单击,因为用户希望单击顶部的锁定列表项以折叠展开的区域。你可以想象当我点击内部 ListFragment 中的另一个列表项时会发生什么,它会重复整个过程。
假设我们打开了多个 Fragment,这些锁定的列表项应该堆叠在一起。我希望能够向下拖动当前一个以查看所有这些都堆叠在一起,这可能是 ListView 设置为不可滚动的问题。你可以说这里的想法是试图限制滚动到某个区域。
我所做或尝试做的是在列表项 XML 中添加 FrameLayout 并将其可见性设置为 GONE。我已经将它的宽度和高度都设置为 match_parent。我已经看到了问题,因为如果它所在的相对布局的高度设置为 128dp,并且我希望 Frame_Layout 的高度一直到屏幕底部,我该怎么做呢?无论如何,我还将底部边距设置为减去它的高度,以隐藏它并稍后展开,以便在项目展开时将其下方的任何其他列表项向下推。我正在使用 ValueAnimator 将动画值从展开设置为折叠,但我认为我的代码错误或搞砸了。我对这一切感到很困惑,但下面是我的代码。这一切都内置在一个自定义适配器的 getView 方法中,在一个视图中。点击监听器。但这带来了另一个问题。如果我在 ListFragment 中覆盖 onListItemClick(),首先是 View.onClickListener 还是 onListItemClick()?
public void setAnimation(final View item, final View viewToBeExpanded)
{
// Gets the height and the reference for viewToBeExpanded's LayoutParams
layoutParams = ((FrameLayout.LayoutParams) viewToBeExpanded.getLayoutParams());
viewToBeExpanded_height = layoutParams.height;
viewToBeExpanded_bottomMargin = layoutParams.bottomMargin;
layoutParams.bottomMargin = -viewToBeExpanded_height + viewToBeExpanded_bottomMargin;
item.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view) {
if (expanded == true) {
expanded = false;
expandAnimator = ValueAnimator.ofInt(layoutParams.bottomMargin, viewToBeExpanded_bottomMargin);
expandAnimator.setTarget(viewToBeExpanded);
expandAnimator.setDuration(500);
expandAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
layoutParams.bottomMargin = (Integer) animation.getAnimatedValue();
viewToBeExpanded.invalidate();
viewToBeExpanded.requestLayout();
}
});
viewToBeExpanded.setVisibility(View.VISIBLE);
expandAnimator.start();
} else {
collapseAnimator = ValueAnimator.ofInt(viewToBeExpanded_bottomMargin, -viewToBeExpanded_height + viewToBeExpanded_bottomMargin);
collapseAnimator.setTarget(viewToBeExpanded);
collapseAnimator.setDuration(500);
collapseAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
layoutParams.bottomMargin = (Integer) animation.getAnimatedValue();
viewToBeExpanded.invalidate();
viewToBeExpanded.requestLayout();
}
});
collapseAnimator.start();
}
}
});
viewToBeExpanded.setVisibility(View.GONE);
}