gpt4 book ai didi

android - Viewpager2 左右滚动预览不起作用

转载 作者:行者123 更新时间:2023-12-05 02:50:29 29 4
gpt4 key购买 nike

我已经实现了带有左右预览的 Viewpager2,如下图所示。但是滚动只适用于 Middle Item(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 效果非常好。

更新的新解决方案感谢 CmTiger 提供了更优化的滚动方式。我已经测试过了。您可以使用值 LEFT_RIGHT = 300 从左到右滚动。从 dp 到像素获取值。然而,你喜欢它。这个新的解决方案需要优化。

    float last_x = 0;

nestedScrollView.setOnTouchListener(new View.OnTouchListener() {

int LEFT_RIGHT = -300; // your offsets
int RIGHT_LEFT = 300;

@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
float x = motionEvent.getX();

if (x > last_x) {
motionEvent.offsetLocation(LEFT_RIGHT, 0);
} else {
motionEvent.offsetLocation(RIGHT_LEFT, 0);
}

last_x = x;

viewpager.dispatchTouchEvent(motionEvent);
return false;
}
});

旧的解决方案

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

viewpager.setOnTouchListener(new View.OnTouchListener() {
float lastValue;
float value;
float delta;

@Override
public boolean onTouch(View view, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
lastValue = event.getX();
viewpager.beginFakeDrag();
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
value = event.getX();
delta = value - lastValue;
viewpager.fakeDragBy(delta * 2);
lastValue = value;
} else if (event.getAction() == MotionEvent.ACTION_CANCEL || event.getAction() == MotionEvent.ACTION_UP) {
viewpager.endFakeDrag();
}

return false;
}
});

关于android - Viewpager2 左右滚动预览不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63667356/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com