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

到此为止,功能是写完了。注意事项,在代码里面也写了,都是我测试了很多遍才得出的结论。

如有不对的,请指正。





猜你喜欢

转载自blog.csdn.net/ming_csdn_/article/details/80322635