抖音上下吸底效果

用RecyclerView+PagerSnapHelper實現

public class DouYinLayoutManager extends LinearLayoutManager implements RecyclerView.OnChildAttachStateChangeListener{

    //判斷是否上滑還是下滑

    private int mDrift;

    private OnViewPagerListener onViewPagerListener;

    //吸頂,吸底

    private PagerSnapHelper pagerSnapHelper;

 

    public OnViewPagerListener getOnViewPagerListener() {

        return onViewPagerListener;

    }

 

    public void setOnViewPagerListener(OnViewPagerListener onViewPagerListener) {

        this.onViewPagerListener = onViewPagerListener;

    }

 

    public DouYinLayoutManager(Context context) {

        super(context);

    }

 

    public DouYinLayoutManager(Context context, int orientation, boolean reverseLayout) {

        super(context, orientation, reverseLayout);

        pagerSnapHelper = new PagerSnapHelper();

    }

 

    /**

     * 當manager完全添加到recycleview中是會被調用

     * @param view

     */

    @Override

    public void onAttachedToWindow(RecyclerView view) {

        view.addOnChildAttachStateChangeListener(this);

        pagerSnapHelper.attachToRecyclerView(view);

        super.onAttachedToWindow(view);

    }

 

    @Override

    public boolean canScrollVertically() {

        return super.canScrollVertically();

    }

 

    @Override

    public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {

        mDrift = dy;

        return super.scrollVerticallyBy(dy, recycler, state);

 

    }

 

    @Override

    public void onChildViewAttachedToWindow(@NonNull View view) {

        if (mDrift > 0){

            //向上滑

            if (onViewPagerListener != null && Math.abs(mDrift) == view.getHeight()){

                onViewPagerListener.onPageSelected(false,view);

            }

        }else {

            //向下滑

            if (onViewPagerListener != null && Math.abs(mDrift) == view.getHeight()){

                onViewPagerListener.onPageSelected(true,view);

            }

        }

    }

 

    @Override

    public void onChildViewDetachedFromWindow(@NonNull View view) {

        if (mDrift >= 0){

            //向上滑

            if (onViewPagerListener != null){

                onViewPagerListener.onPageRelease(true,view);

            }

        }else {

            //向下滑

            if (onViewPagerListener != null){

                onViewPagerListener.onPageRelease(false,view);

            }

        }

    }

 

    @Override

    public void onScrollStateChanged(int state) {

        switch (state){

            case RecyclerView.SCROLL_STATE_IDLE:

                //當前顯示的item

                View snapView = pagerSnapHelper.findSnapView(this);

                if (onViewPagerListener != null){

                    onViewPagerListener.onPageSelected(false,snapView);

                }

                break;

        }

        super.onScrollStateChanged(state);

 

    }

}

recyclerView.setLayoutManager()即可

recyclerView = findViewById(R.id.recyclerView_dy);

        douYinLayoutManager = new DouYinLayoutManager(this, OrientationHelper.VERTICAL,false);

        recyclerView.setLayoutManager(douYinLayoutManager);

        recyclerView.setAdapter(new MyAdapter());

 

        douYinLayoutManager.setOnViewPagerListener(new OnViewPagerListener() {

            @Override

            public void onPageRelease(boolean isNest, View position) {

                releaseVideo(position);

            }

             function(){ //XM代理申請 http://www.xmchina.net.cn/ 

            @Override

            public void onPageSelected(boolean isButten, View position) {

                playVideo(position);

            }

        });

    }

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章