Viewpager2在左右滚动预览不起作用

问题描述

我已经实现了Viewpager2的左右预览,如下图所示。但是滚动仅适用于中间项目(2)。不在左(1)和右(3)项目预览上。 如何在左右预览上进行滚动操作

enter image description here

  <androidx.viewpager2.widget.ViewPager2
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal"
            android:layout_marginTop="@dimen/_5sdp"
            android:paddingStart="@dimen/_50sdp"
            android:paddingEnd="@dimen/_50sdp"
            />

Java代码

    viewpager.setoffscreenPageLimit(3);
    viewpager.setClipToPadding(false);
    viewpager.setClipChildren(false);


    CompositePageTransformer cpt = new CompositePageTransformer();

    cpt.addTransformer(new MarginPageTransformer(10));
    cpt.addTransformer(new ViewPager2.PageTransformer() {
        @Override
        public void transformPage(@NonNull View page,float position) {
            float r = 1 - Math.abs(position);
            page.setScaleY(0.80f + r * 0.20f);
        }
    });

   viewpager.setPageTransformer(cpt);
   viewpager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
        @Override
        public void onPageScrolled(int position,float positionOffset,int positionOffsetPixels) {
            super.onPageScrolled(position,positionOffset,positionOffsetPixels);

            
            if (position == 0) {
                viewpager.setCurrentItem((int) (A1.list.size() / 2));

            }
            
        }
    });

解决方法

老实说,由于Viewpager2类是最终的,所以我没有找到使Viewpager2能够处理左右预览上的滑动事件的真正方法。但是使用NestedScrollview效果很好。

          <androidx.core.widget.NestedScrollView
            android:id="@+id/nestedScroll"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

        <androidx.viewpager2.widget.ViewPager2
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:layout_marginTop="@dimen/_5sdp"
            android:paddingStart="@dimen/_50sdp"
            android:paddingEnd="@dimen/_50sdp"
            />
        </androidx.core.widget.NestedScrollView>

在我使用Scrollview之前,ACTION_CANCEL仍然存在一些问题。切换到Nested_Scrollview后,效果很好。

  nestedScroll = view.findViewById(R.id.nestedScroll);

  nestedScroll.setOnTouchListener(new View.OnTouchListener() {
        float start=0;
        @Override
        public boolean onTouch(View view,MotionEvent motionEvent) {
            Log.d("TAG","onTouch: "+ motionEvent.getAction());

            if(motionEvent.getAction() == MotionEvent.ACTION_MOVE) {
                Log.d("TAG","onTouch: ACTION_MOVE" +  viewpager.getCurrentItem());
                viewpager.beginFakeDrag();

                if( start > motionEvent.getX()) {
                    viewpager.fakeDragBy((-1*motionEvent.getXPrecision()));
                }else {

                    viewpager.fakeDragBy((motionEvent.getXPrecision()));

                }

              //  Log.d("TAG","onTouch: start"+start+"  " + motionEvent.getX());
                start =motionEvent.getX();
             }
            if(motionEvent.getAction() == MotionEvent.ACTION_UP) {
             //  viewpager.

                if(viewpager.isFakeDragging()){
                    viewpager.endFakeDrag();
                }

             }
            if(motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                //  viewpager.

              //  Log.d("TAG","onTouch: ACTION_DOWN" + motionEvent.getXPrecision());
                start=motionEvent.getX();
             }


     /*   if(motionEvent.getAction() == MotionEvent.ACTION_CANCEL) {
                //  viewpager.
                if(viewpager.isFakeDragging()){
                    viewpager.endFakeDrag();
                    if( start > motionEvent.getX()) {
                        viewpager.setCurrentItem( viewpager.getCurrentItem()+1);
                    }else {
                        viewpager.setCurrentItem( viewpager.getCurrentItem()-1);
                    }
                }

             }*/

            return false;
        }
    });