21

我有一个viewpager,它包含一些信息,但它让我从左到右滑动页面我怎样才能让它从左到右滑动,这意味着改变它的方向?

4

14 回答 14

23

我认为您可以使用将当前页面设置为最后一页viewPager.setCurrentItem()。然后它会从左向右滑动.. :)

于 2013-09-13T08:48:19.487 回答
17

这是改变 Viewpager 的滑动方向的非常简单的技术。

有两个简单的步骤必须跟随你,

1.改变View pager的旋转,

viewpager.setRotationY(180);

2.然后再次改变片段容器的方向,它是viewpager的孩子,

recyclerView.setRotationY(180);

注意:就我而言,我使用 recyclerview 作为视图寻呼机的子级。

这对我来说是 100% 的。

于 2017-01-25T14:40:22.013 回答
9

您已经可以双向滑动了。默认情况下,它显示第 0 页,但您可以更改它:

protected void onCreate(Bundle savedInstanceState) {
    // ...
    viewPager.setCurrentItem(myFragmentCount-1); 
    // ...
于 2013-09-13T08:49:19.660 回答
5

如果您支持 API28 及更高版本,请不要对 ViewPager 使用旋转,因为它会使 ViewPager 在 android pie 上滑动太困难,请参阅此问题。这个库帮助我实现了 RTL ViewPager https://github.com/duolingo/rtl-viewpager

将其添加到依赖项并确保将 layoutDirection="locale" 添加到 RtlViewPager

<com.duolingo.open.rtlviewpager.RtlViewPager
        android:layoutDirection="locale"
        android:keepScreenOn="true"
        android:id="@+id/quranViewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:animateLayoutChanges="true"
     />

更新

ViewPager2 对区域设置友好,因此它会根据当前设备区域设置自动更改滑动方向。

有关 ViewPager2 实现的一些有用链接:

安卓文档

样本

于 2019-05-19T11:18:45.570 回答
4

我确定它与操作无关,但我找到了一个对我有用的解决方案(因为修改数据对我来说是个问题)。我只是在 Y 轴上将 viewpager 旋转了 180 度,然后在 180 中再次旋转了它的子视图。

android.view.View

public void setRotationY(float rotationY)

希望它对任何人都有帮助,因为我认为这是最接近 Android 在更改为 rtl 语言时镜像所有操作系统的方式。

于 2016-06-04T00:34:46.147 回答
3

你可以做这样的事情,

ViewPager.setCurrentItem(lastposition);
于 2013-09-13T08:48:44.647 回答
3

我的解决方案。动态:

public class RTLViewPager extends ViewPager {

    public RTLViewPager(Context context) {
        super(context);
    }

    public RTLViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void setAdapter(PagerAdapter adapter) {
        super.setAdapter(adapter);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            if(getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL){
                setCurrentItem(adapter.getCount()-1);
            }
        }
    }
}
于 2016-05-04T11:51:46.323 回答
3

我知道这个问题很老,但这是我的版本:

为了让您的 viewpager 滑动 RTL ,无论它里面是否有片段或视图,您都需要执行以下操作

第一步:定义一个整数:R.integer.angle_rotation_for_rtl

因为values它是0

因为values-rtl它是180

第2步:

viewPager.setRotationY(getResources().getInteger(R.integer.angle_rotation_for_rtl)); 

第 3 步:

   viewPager.setPageTransformer(false, new ViewPager.PageTransformer() {
            @Override
            public void transformPage(@NonNull View page, float position) {
                page.setRotationY(getResources().getInteger(R.integer.angle_rotation_for_rtl));

            }
        });

结果 - 一个流畅工作的浏览器,没有额外的 ifs

于 2018-12-13T09:53:56.943 回答
2

首先,您需要在您的类中实现 OnPageChangeListener,然后将侦听器设置为您的 viewpager,例如 viewpager.setOnPageChangeListener(yourclass.this); 希望这会奏效。

于 2013-09-13T08:57:14.200 回答
1

在布局中:

   <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:layoutDirection="rtl">
        <androidx.viewpager.widget.ViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layoutDirection="locale"/>
    </LinearLayout>

在代码中:

  //region swipe right to left
        pager.setRotationY(180);
        pager.setPageTransformer(false, new ViewPager.PageTransformer() {
            @Override
            public void transformPage(@NonNull View page, float position) {
                page.setRotationY(180);

            }
        });
  //endregion
于 2019-12-18T10:03:00.880 回答
0

您没有任何第三方库。Android 最近添加了一个名为 ViewPager2 的新 UI 组件,它支持 RTL View Pager。

https://developer.android.com/jetpack/androidx/releases/viewpager2

请在下面找到答案的链接。答案是关于迁移指南和示例 github 应用程序以支持 RTL 视图寻呼机。

https://stackoverflow.com/a/59558911/651377

于 2020-01-02T06:15:23.077 回答
0

为了让您的水平 ViewPager 在 LayoutDirection 更改时表现得像 RecyclerView ,只需将此方法添加到您的自定义 ViewPager ;

public class LoopViewPager extends ViewPager {
....
...
    public void setLayoutDirection(int layoutDirection) {
        if(layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) {
            setRotationY(0);
        }
        else if(layoutDirection == ViewCompat.LAYOUT_DIRECTION_RTL) {
            setRotationY(180);
    }
}

并在哪里使用 viewPager 像这样动态设置它;

viewPager.setLayoutDirection(context.getResources().getConfiguration().getLayoutDirection());
于 2018-03-07T20:36:48.617 回答
0

如果你想从左向右移动 -> viewPager.setCurrentItem(viewPager.currentItem+1,true)//传递布尔值以实现平滑滚动 如果你想从右向左移动 -> viewPager.setCurrentItem(viewPager.currentItem-1)//不平滑滚动

于 2021-06-15T05:16:48.207 回答
0

我完全理解这个问题得到了完美的回答;但是如果你使用的是 RTL 语言;例如,如果您有一本书要在 ViewPager 中显示;那么除了答案之外,您还可以考虑将页面翻过来以获得正确的页面;为此修改您的 ViewPager 适配器的getItem()方法

@Override
public Fragment getItem(int position) {
    return SomeFragment.newInstance(N_PAGES - position - 1); // to filp the pages
}
于 2019-09-29T21:49:21.923 回答