android列表滑动时,帧动画滑出屏幕,列表静止时,帧动画滑入屏幕
首先看看效果
布局文件activity_translate_animation
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="wrap_content"/> <ImageView android:id="@+id/image_" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentBottom="true" android:layout_marginBottom="90dp" /> </RelativeLayout>
drawable动画my_animation
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@mipmap/hua111" android:duration="100" /> <item android:drawable="@mipmap/hua222" android:duration="100" /> </animation-list>
Activity
public class TranslateAnimationActivity extends Activity { private RecyclerView mRecyclerView; private List<String> mDatas; private ImageView imageView; private float imgWidth;//imageView的宽,用于横向滑动的距离 private boolean isStaticed = true;//是否静止。防止在滑动的时候,反复一直执行退出动画,保证每次滑动只执行一次 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_translate_animation); initData(); mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview); LinearLayoutManager layoutManager = new LinearLayoutManager(this); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); mRecyclerView.setLayoutManager(layoutManager); mRecyclerView.setAdapter(new MyRecyclerAdapter(this, mDatas)); imageView = (ImageView) findViewById(R.id.image_); //设置帧动画 imageView.setBackgroundResource(R.drawable.my_animation); AnimationDrawable animationDrawable_ = (AnimationDrawable) imageView.getBackground(); animationDrawable_.start(); //正确获取imageView的宽 imageView.post(new Runnable() { @Override public void run() { imgWidth = imageView.getWidth();//单位px } }); mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); //mRecyclerView静止时执行 isStaticed = true; //recyclerView.canScrollVertically(1)=false,recyclerView.canScrollVertically(-1)=true 时,为滑到顶部 //recyclerView.canScrollVertically(1)=true,recyclerView.canScrollVertically(-1)=false 时,为滑到底部 //recyclerView.canScrollVertically(1)=true,recyclerView.canScrollVertically(-1)=true 时,为中间滑动 //判断滑到顶部和底部,是为了,到达顶部和底部的滑动时,不执行进入和退出的动画,此时还有帧动画 if (recyclerView.canScrollVertically(1) && recyclerView.canScrollVertically(-1)) { imgTranslateAnimation(imgWidth, 0); } else { //滑动到顶部或者底部时,不执行动画。需要清除动画。 imageView.clearAnimation(); } } private int totalDy = 0; @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); totalDy += dy; if (totalDy != 0) {//初始化时,会自动执行一次此方法。为了初始化时让onScrolled的退出动画不执行,用滑动距离来判断是否是初始化。 if (isStaticed) {//防止在滑动的时候,反复一直执行退出动画,保证每次滑动只执行一次 isStaticed = false; if (recyclerView.canScrollVertically(1) && recyclerView.canScrollVertically(-1)) { imgTranslateAnimation(0, imgWidth); } else { imageView.clearAnimation(); } } } } }); } //制造数据 private void initData() { mDatas = new ArrayList<>(); for (int i = 0; i < 70; i++) { String data = "测试" + (i + 1); mDatas.add(data); } } //动画的左右进出平移动画 private void imgTranslateAnimation(float fromXDelta, float toXDelta) { TranslateAnimation translateAnimation = new TranslateAnimation(fromXDelta, toXDelta, 0, 0); translateAnimation.setFillAfter(true);//这句话会造成imageView.setVisibility(GONE)的时候,会停留在动画最后的地方,导致还没有隐藏的假象。 translateAnimation.setDuration(800); imageView.setAnimation(translateAnimation); imageView.startAnimation(translateAnimation); } }
MyRecyclerAdapter非常简单,还是贴一下
public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyHolder> { private Context mContext; private List<String> mDatas; public MyRecyclerAdapter(Context context, List<String> datas) { super(); this.mContext = context; this.mDatas = datas; } @Override public int getItemCount() { return mDatas.size(); } @Override public void onBindViewHolder(MyHolder holder, int position) { holder.textView.setText(mDatas.get(position)); } @Override public MyHolder onCreateViewHolder(ViewGroup arg0, int arg1) { View view = LayoutInflater.from(mContext).inflate(R.layout.recyclerview_item, null); MyHolder holder = new MyHolder(view); return holder; } class MyHolder extends RecyclerView.ViewHolder { private TextView textView; public MyHolder(View view) { super(view); textView = (TextView) view.findViewById(R.id.textview); } } }布局recyclerview_item更简单,就是一个TextView
到此为止,功能是写完了。注意事项,在代码里面也写了,都是我测试了很多遍才得出的结论。
如有不对的,请指正。