选定ListView项的向上滑动动画

3
我有一个列表视图。我想添加一个动画,如果我选择一个列表项,那么它将被移除,下面的其余项将使用向上滑动动画被上移。我已经通过获取线性布局的子项位置来完成了这个操作,但我不知道如何将列表视图中其余元素向上滑动。请帮忙。
下面是我动态创建的线性布局的动画代码:
    plus.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            Animation animation1 = AnimationUtils.loadAnimation(getActivity(), R.anim.move);
            final Animation animation2 = AnimationUtils.loadAnimation(getActivity(), R.anim.moveup);

这是我们点击的物品的动画效果

            lay1.startAnimation(animation1);

这是用于动画效果的代码,可以让子元素向上滑动

            final int i = lay1.getId() + 1;


            final Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    //Do something after 100ms

                    try {
                        LinearLayout l = (LinearLayout)                       layoutall.getChildAt(i);
                        l.startAnimation(animation2);
                        layoutall.removeView(lay1);
                    } catch (Exception e) {

                        //connectToDatabase();
                    }
                }
            }, 600);

更新的代码 非常感谢。我已经成功实现了这个功能,但是问题在于我在一个listview中使用了两个动画,但无法实现第一个动画。

我想要向左滑动列表项的代码(在单击时)

       viewHolder.accept.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                removeListItem(viewHolder.order_card_layout, position);

            }
        });

动画代码如下所示

      protected void removeListItem(final View rowView, final int positon) {
    // TODO Auto-generated method stub


    final Animation animation = AnimationUtils.loadAnimation(rowView.getContext(), R.anim.move);
    rowView.startAnimation(animation);

    Animation.AnimationListener al = new Animation.AnimationListener() {
        @Override
        public void onAnimationEnd(Animation arg0) {

            ViewHolder vh = (ViewHolder) rowView.getTag();
            //vh.needInflate = true;

        }
        @Override public void onAnimationRepeat(Animation animation) {}
        @Override public void onAnimationStart(Animation animation) {}
    };


    collapse(rowView, al);

但问题是我的第一个动画不起作用,即向右滑动

    final Animation animation = AnimationUtils.loadAnimation(rowView.getContext(), R.anim.move);
    rowView.startAnimation(animation);
新更新的代码 我已经实现了这个功能,但问题是我使用了两个动画,想在我点击的那个项目上做第一个动画,在所有下面的列表项上做另一个动画。但我的问题是,我点击的项目向右滑动,然后它重新出现并与整个列表一起向上滑动,但我希望我点击的项目向右滑动,其余的项目向上滑动。

我想往左滑动的列表项代码:
       viewHolder.accept.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                removeListItem(viewHolder.order_card_layout, position);

            }
        });
动画代码如下:

保护 void removeListItem(final View rowView, final int positon) { // TODO Auto-generated method stub

这段代码用于删除列表项。

    final Animation animation = AnimationUtils.loadAnimation(rowView.getContext(), R.anim.move);
    rowView.startAnimation(animation);


    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            //Do something after 100ms

            try {


                Animation.AnimationListener al = new Animation.AnimationListener() {
                    @Override
                    public void onAnimationEnd(Animation arg0) {

                        ViewHolder vh = (ViewHolder) rowView.getTag();
                        //vh.needInflate = true;

                    }

                    @Override
                    public void onAnimationRepeat(Animation animation) {
                    }

                    @Override
                    public void onAnimationStart(Animation animation) {
                    }
                };


                collapse(rowView, al);


            } catch (Exception e) {

                //connectToDatabase();
            }
        }
    }, 600);





}






            private void collapse(final View v, Animation.AnimationListener al) {
    final int initialHeight = v.getMeasuredHeight();

    Animation anim = new Animation() {
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            if (interpolatedTime == 1) {
                v.setVisibility(View.GONE);
            }
            else {
                v.getLayoutParams().height = initialHeight - (int)(initialHeight * interpolatedTime);
                v.requestLayout();
            }
        }

        @Override
        public boolean willChangeBounds() {
            return true;
        }
    };

    if (al!=null) {
        anim.setAnimationListener(al);
    }
    anim.setDuration(600);
    v.startAnimation(anim);
}
2个回答

1

非常感谢。我已经成功实现了这个功能,但问题是我在一个列表视图中使用了两个动画,但无法实现第一个动画。我的代码是: - Mukesh Mishra

0

这里是代码,我正在实现两种动画。

1)当点击列表项时,从右侧滑入。

2)当单击删除按钮时,在列表视图中为其余行执行向上滑动动画(在我提供的链接中已经完成)。

将下面的文件复制到您的anim文件夹中。

1)fade_out.xml:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <alpha
        android:duration="700"
        android:fromAlpha="1"
        android:toAlpha="0" />
</set>

2) fade_in.xml :

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <alpha
        android:duration="700"
        android:fromAlpha="0"
        android:toAlpha="1" />
</set>

3) slide_in_right.xml :

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate
        android:duration="700"
        android:fromXDelta="100%"
        android:toXDelta="0%" />
</set>

4) slide_out_right.xml :

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate
        android:duration="700"
        android:fromXDelta="0%"
        android:toXDelta="100%" />
</set>

现在将以下方法和类添加到您的活动中:

//Animation
    private void fadeOutView(View view) {
        Animation fadeOut = AnimationUtils.loadAnimation(view.getContext(), R.anim.fade_out);
        if (fadeOut != null) {
            fadeOut.setAnimationListener(new ViewAnimationListener(view) {
                @Override
                protected void onAnimationStart(View view, Animation animation) {

                }

                @Override
                protected void onAnimationEnd(View view, Animation animation) {
                    view.setVisibility(View.GONE);
                }
            });
            view.startAnimation(fadeOut);
        }
    }

    private void fadeInView(View view) {
        Animation fadeIn = AnimationUtils.loadAnimation(view.getContext(), R.anim.fade_in);
        if (fadeIn != null) {
            fadeIn.setAnimationListener(new ViewAnimationListener(view) {
                @Override
                protected void onAnimationStart(View view, Animation animation) {
                    view.setVisibility(View.VISIBLE);
                }

                @Override
                protected void onAnimationEnd(View view, Animation animation) {

                }
            });
            view.startAnimation(fadeIn);
        }
    }

    private void slideInView(View view) {
        Animation slideIn = AnimationUtils.loadAnimation(view.getContext(), R.anim.slide_in_right);
        if (slideIn != null) {
            slideIn.setAnimationListener(new ViewAnimationListener(view) {
                @Override
                protected void onAnimationStart(View view, Animation animation) {
                    view.setVisibility(View.VISIBLE);
                }

                @Override
                protected void onAnimationEnd(View view, Animation animation) {

                }
            });
            view.startAnimation(slideIn);
        }
    }

    private void slideOutView(View view) {
        Animation slideOut = AnimationUtils.loadAnimation(view.getContext(), R.anim.slide_out_right);
        if (slideOut != null) {
            slideOut.setAnimationListener(new ViewAnimationListener(view) {
                @Override
                protected void onAnimationStart(View view, Animation animation) {

                }

                @Override
                protected void onAnimationEnd(View view, Animation animation) {
                    view.setVisibility(View.GONE);
                }
            });
            view.startAnimation(slideOut);
        }
    }

    private abstract class ViewAnimationListener implements Animation.AnimationListener {

        private final View view;

        protected ViewAnimationListener(View view) {
            this.view = view;
        }

        @Override
        public void onAnimationStart(Animation animation) {
            onAnimationStart(this.view, animation);
        }

        @Override
        public void onAnimationEnd(Animation animation) {
            onAnimationEnd(this.view, animation);
        }

        @Override
        public void onAnimationRepeat(Animation animation) {

        }

        protected abstract void onAnimationStart(View view, Animation animation);

        protected abstract void onAnimationEnd(View view, Animation animation);
    }

现在,如果您想在列表项单击时显示动画,则应在适配器类中提供动画,在其中为listView填充raw_layout。

5) raw_layout.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:id="@+id/linLayout">

    <ImageButton
        android:id="@+id/cell_trash_button"
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:src="@drawable/trash_can"
        android:scaleType="fitXY" />

    <TextView
        android:id="@+id/cell_name_textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical|left"
        android:layout_marginLeft="16dp"
        android:layout_weight="1"
        android:text="cell name" />

</LinearLayout>

6) 最后,在适配器的getView()方法中,为raw_layout的父布局应用动画,当父布局被点击时触发。这里我的raw_layout的父布局是一个LinearLayout,其id名为linLayout

vh.linLayout.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (vh.linLayout.getVisibility() == View.VISIBLE) {
                        fadeOutView(vh.linLayout);
                        slideInView(vh.linLayout);
                    } else {
                        fadeInView(vh.linLayout);
                        slideOutView(vh.linLayout);
                    }
                }
            });

我已经尝试过这个方法,它是有效的。所以你也可以试一下!


我已经发布了我之前发布的内容。这是我的代码。你的代码不能按照我需要的方式工作。 - Mukesh Mishra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接