所以,我正在尝试使用动画,到目前为止,这是一个非常头痛的问题。我在这里尝试做的事情与我通常看到的有点不同。
该场景是我在Activity启动时使用FragmentTransactions夸大ListFragment。当我点击列表项时,我希望项目滚动到屏幕顶部,使其顶部触及操作栏的底部。不仅如此,我希望列表项的底部扩展到屏幕的底部。在完成所有这些工作的同时,我想在列表项下的现在展开的区域中使用FragmentTransactions添加另一个ListFragment。父ListView应该是不可滚动的,但仍然可以点击,因为用户想要点击顶部的锁定列表项来折叠展开的区域。你可以想象当我点击内部ListFragment中的另一个列表项时会发生什么,它会重复整个过程。
假设我们打开了多个片段,那些锁定列表项应该叠加在一起。我希望能够向下拖动当前的一个以查看所有这些堆叠在彼此之上,这可能是ListView设置为不可滚动的问题。你可以说这里的想法是试图限制滚动到某个区域。
我已经完成或尝试过的是在列表项XML中添加FrameLayout并将其可见性设置为GONE。我把它的宽度和高度都设置为match_parent。我已经可以看到问题了,因为如果相对布局的高度设置为128dp的高度,并且我希望Frame_Layout的高度一直到屏幕的底部,我该怎么做?无论如何,我还将底部边距设置为减去它的高度,以隐藏它并稍后展开,这样当项目展开时它将推动其下方的任何其他列表项目。我正在使用ValueAnimator将动画值从展开设置为折叠,但我认为我的代码错误或搞砸了。我对这一切感到很困惑,但这是我的代码。它都是在View.onClickListener中的自定义适配器的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);
}