大海话语
2022-01-07 20:09
采纳率: 87.6%
浏览 52

Fragment中实现RecyclerView滑动监听后,调用setOnTouchListener。

我现在做一个在Fragment里面将RecyclerView滑动后,本身做一个调整后,再调用或者触发整个屏幕的一个监听事件,但是,我实现的时候呢,却不起作用。
先是直接调用在RecyclerView中,后,又试了下,在onViewCreated中先初始化一下,但是,还是不行呢?
下面是Fragment里面的RecyclerView滚动监听的一些写法

private void initRecyclerSlide() {
        RecyclerView.LayoutManager layoutManager = mRecyclerView.getLayoutManager();
        /*
         * 判断是当前layoutManager是否为LinearLayoutManager
         * 只有LinearLayoutManager才有查找第一个和最后一个可见view位置的方法
         * */
        if (layoutManager instanceof LinearLayoutManager) {
            LinearLayoutManager linearManager = (LinearLayoutManager) layoutManager;
            //获取最后一个可见view的位置
            int lastItemPosition = linearManager.findLastVisibleItemPosition();
            if (lastItemPosition == 0) {
//                setMarginTop(tuyuBigPage.getHeight() + tuyuMiddlePage.getHeight() );//下拉时,大图加小图,因为减过
//                tuyuBigPage.setVisibility(View.VISIBLE);
            }
            //获取第一个可见view的位置
            int firstItemPosition = linearManager.findFirstVisibleItemPosition();
            if (firstItemPosition == 0) {
//                tuyuBigPage.setVisibility(View.INVISIBLE);
//                setMarginTop(tuyuBigPage.getHeight() - tuyuMiddlePage.getHeight());//上滑时 大头部 减 要隐藏的头部
            }

        }

        //RecyclerView 上推 隐藏
        //RecyclerView 上推 隐藏
        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                initListener();
                if (dy < 0) {
                    tuyuBigPage.setVisibility(View.VISIBLE);
                    setMarginTop(tuyuBigPage.getHeight() + tuyuMiddlePage.getHeight());//下拉时,大图加小图,因为减过
                } else if (dy > 0) {
                    tuyuBigPage.setVisibility(View.INVISIBLE);
                    setMarginTop(tuyuBigPage.getHeight() - tuyuMiddlePage.getHeight());//上滑时 大头部 减 要隐藏的头部
                }
//                RecyclerViewUtils.getInstance().reCircleMenu.bringToFront();
//                reCircleMenu.bringToFront();
            }

            @Override
            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
//                    tuyuBigPage.setVisibility(View.INVISIBLE);
                } else if (newState == RecyclerView.SCROLL_STATE_IDLE) {
//                    tuyuBigPage.setVisibility(View.VISIBLE);
                }
            }
        });
    }

下面是Fragment里面整个屏幕的一个方法

//触碰监听
    public void initListener() {
        //触碰监听
        TuyuFragment.this.myOnTouchListener = new MyOnTouchListener() {
            @Override
            public boolean dispatchTouchEvent(MotionEvent ev) {//就是这个 dispatchTouchEvent  没有在Fragment里面重写
                return dispathTouchEvent(ev);
            }
        };
        registerMyOnTouchListener(myOnTouchListener);
    }

//---------------------------------设置隐藏头部
    private boolean dispathTouchEvent(MotionEvent event) {
        if (mIsAnim) {
            return false;
        }
        final int action = event.getAction();  //得到移动

        float x = event.getX();  //移动横轴
        float y = event.getY();  //移动竖轴

        switch (action) {
            case MotionEvent.ACTION_DOWN:
                lastY = y;
                lastX = x;
                return false;
            case MotionEvent.ACTION_MOVE:
                float dY = Math.abs(y - lastY);  //当前竖移动点 减 0值
                float dX = Math.abs(x - lastX);  //当前横移动点 减 0值
                boolean down = y > lastY ? true : false; //当前竖移动点 > 0值
                lastY = y;
                lastX = x;
                isUp = dX < 8 && dY > 8 && !mIsTitleHide && !down; //手指Up状态:如果横不小于8 竖不大于8,  隐藏为真或不是down时
                isDown = dX < 8 && dY > 8 && mIsTitleHide && down; //手指Down状态:如果横不小于8 竖不大于8,  隐藏为假或是down时
                if (isUp) {
                    View view = this.tuyuBigPage;
                    float[] f = new float[2];
                    f[0] = 0.0F;
                    f[1] = -tuyuMiddlePage.getHeight();//获取要隐藏的 高度
                    ObjectAnimator animator1 = ObjectAnimator.ofFloat(view, "translationY", f);
                    animator1.setInterpolator(new AccelerateDecelerateInterpolator());
                    animator1.setDuration(500);//设置动画时间
                    animator1.start();
                    animator1.addListener(this);
                    tuyuPlayBar000.setVisibility(View.INVISIBLE);
                    setMarginTop(tuyuBigPage.getHeight() - tuyuMiddlePage.getHeight());//大头部 减 要隐藏的头部
                } else if (isDown) {
                    View view = this.tuyuBigPage;
                    float[] f = new float[2];
                    f[0] = -tuyuMiddlePage.getHeight();
                    f[1] = 0F;
                    ObjectAnimator animator1 = ObjectAnimator.ofFloat(view, "translationY", f);
                    animator1.setDuration(300);
                    animator1.setInterpolator(new AccelerateDecelerateInterpolator());
                    animator1.start();
                    animator1.addListener(this);
                } else {
                    return false;
                }
                mIsTitleHide = !mIsTitleHide;
                mIsAnim = true;
                break;
            default:
                return false;
        }
        return false;

    }

这个屏幕监听事件在单独使用时,能够生效,就是在RecyclerView实现后,再调用它,却不成功。
因为,我想做一个将Recycler下滑动时,隐藏一些头部,让Recycler上浮,再下拉时,再将头部下拉致原来的位置。。

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

2条回答 默认 最新

相关推荐 更多相似问题