2016-12-16 79 views
2

我有一个列表视图。我想添加一个动画,如果我选择一个列表项目,那么它将被删除,该项目下的其他项目将随着向上滑动动画向上移动。我已通过获取其子位置来完成线性布局,但我无法理解如何滑动listview的其余元素。请帮助向上滑动选定的列表视图项目的动画

下面是我在动态创建的线性布局动画代码

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); 

更新代码 非常感谢。我能够实现这个功能,但问题是我在一个列表视图中使用了两个动​​画,但无法实现第一个动画。

我的列表项的代码就是我要刷上点击

 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); 

      } 
     }); 

和代码动画左边,而为

保护无效removeListItem(最终查看rowView,最终诠释当前位置){ // TODO自动生成方法存根

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); 
} 

回答

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()父母的适配器的onClick的方法raw_layout的父布局Layout.Here我对raw_layout父布局的LinearLayout其编号分别为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); 
        } 
       } 
      }); 

我已经试过这个,它的工作。所以试试这一次!

+0

不,这不起作用 –

+0

发布您的代码。 –

+0

已经发布,我已在上面发布。这是我的代码。并且你的代码不能以我需要的方式工作 –