【问题标题】:Viewpager2 scrolling on preview left and right is not workingViewpager2 在左右预览上滚动不起作用
【发布时间】:2020-08-31 08:29:28
【问题描述】:

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

  <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));

            }
            
        }
    });

【问题讨论】:

    标签: android android-viewpager2


    【解决方案1】:

    老实说,我没有找到真正的方法让 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>
    

    只需使用此代码即可使其工作。增加 speed 的 int 值以增加速度,反之亦然。

      nestedScroll = view.findViewById(R.id.nestedScroll);
    
        nestedScroll2.setOnTouchListener(new View.OnTouchListener() {
            float start = 0;
            float limit_to_start_moving = 5;
            int speed = 7;
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
    
                if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                    // Touch Starts X  DOWN_X
                    start = motionEvent.getX();
                }
    
                if (motionEvent.getAction() == MotionEvent.ACTION_MOVE) {
                    // get position
                    float X2 = motionEvent.getX();
    
                    if ((X2 - limit_to_start_moving) > start) {
                        // LEFT & RIGHT DIRECTION
                        if (start < X2)
                            viewpager.fakeDragBy((motionEvent.getXPrecision() * speed));
                        else
                            viewpager.fakeDragBy((motionEvent.getXPrecision() * -speed));
                        start = X2;  // old position
    
                    } else if ((X2 + limit_to_start_moving) < start) {
    
                        if (start < X2)
                            viewpager.fakeDragBy((motionEvent.getXPrecision() * speed));
                        else
                            viewpager.fakeDragBy((motionEvent.getXPrecision() * -speed));
                        start = X2;
    
                    }
                }
    
                if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
    
                    if (viewpager.isFakeDragging()) {
                        viewpager.endFakeDrag();
                    }
    
                }
    
                if (motionEvent.getAction() == MotionEvent.ACTION_CANCEL) {
    
                    if (viewpager.isFakeDragging()) {
                        viewpager.endFakeDrag();
                        if (start > motionEvent.getX()) {
                            viewpager.setCurrentItem(viewpager.getCurrentItem() + 1);
                        } else {
                            viewpager.setCurrentItem(viewpager.getCurrentItem() - 1);
                        }
                    }
    
                }
    
                return false;
            }
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-22
      • 2018-02-15
      • 2022-01-02
      • 2021-11-13
      • 1970-01-01
      • 2014-05-03
      • 2017-01-31
      • 1970-01-01
      相关资源
      最近更新 更多