sách gpt4 ai đã đi

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

In lại 作者:行者123 更新时间:2023-12-05 02:50:29 29 4
mua khóa gpt4 Nike

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

nhập mô tả hình ảnh ở đây

  <>
android:id="@+id/viewpager"
android:layout_width="phù hợp với cha mẹ"
android:layout_height="phù hợp với cha mẹ"
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() {
@Ghi đè
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() {
@Ghi đè
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
super.onPageScrolled(position, positionOffset, positionOffsetPixels);


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

}

}
});

1 Câu trả lời

老实说,由于 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;

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

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

last_x = x;

viewpager.dispatchTouchEvent(motionEvent);
trả về false;
}
});

旧的解决方案

          <>
android:id="@+id/nestedScroll"
android:layout_width="phù hợp với cha mẹ"
android:layout_height="wrap_content">

<>
android:id="@+id/viewpager"
android:layout_width="phù hợp với cha mẹ"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="@dimen/_5sdp"
android:paddingStart="@dimen/_50sdp"
android:paddingEnd="@dimen/_50sdp"
/>

只需使用此代码即可使其工作。增加 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;
@Ghi đè
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));
khác
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));
khác
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);
} khác {
viewpager.setCurrentItem(viewpager.getCurrentItem() - 1);
}
}

}

trả về false;
}
});

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

@Ghi đè
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();
}

trả về false;
}
});

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

29 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com