1

所以,我正在尝试使用动画,到目前为止,这是一个非常令人头疼的问题。我在这里尝试做的也与我通常看到的有所不同。

场景是我在 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);
    } 
4

0 回答 0