Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ViewPager-在左右两侧显示页面预览_Android_Android Viewpager - Fatal编程技术网

Android ViewPager-在左右两侧显示页面预览

Android ViewPager-在左右两侧显示页面预览,android,android-viewpager,Android,Android Viewpager,我正在使用Android的ViewPager。我想做的是在页面的左侧和右侧显示预览。我已经看到在哪里可以使用负片pageMargin来显示右侧的预览 setPageMargin(-100); 是否有任何方式,我可以显示预览的左侧以及?它基本上与我正在寻找的gallery小部件类似。使用此片段适配器和类以左滚动和右滚动的方式查看viewpager。添加必要的类以滚动查看下一页 package com.rmn.viewpager; import java.util.List; import a

我正在使用Android的
ViewPager
。我想做的是在页面的左侧和右侧显示预览。我已经看到在哪里可以使用负片
pageMargin
来显示右侧的预览

setPageMargin(-100);

是否有任何方式,我可以显示预览的左侧以及?它基本上与我正在寻找的gallery小部件类似。

使用此片段适配器和类以左滚动和右滚动的方式查看viewpager。添加必要的类以滚动查看下一页

package com.rmn.viewpager;

import java.util.List;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

/**
 * The <code>PagerAdapter</code> serves the fragments when paging.
 * @author mwho
 */
public class PagerAdapter extends FragmentPagerAdapter {

    private List<Fragment> fragments;
    /**
     * @param fm
     * @param fragments
     */
    public PagerAdapter(FragmentManager fm, List<Fragment> fragments) {
        super(fm);
        this.fragments = fragments;
    }
    /* (non-Javadoc)
     * @see android.support.v4.app.FragmentPagerAdapter#getItem(int)
     */
    @Override
    public Fragment getItem(int position) {
        return this.fragments.get(position);
    }

    /* (non-Javadoc)
     * @see android.support.v4.view.PagerAdapter#getCount()
     */
    @Override
    public int getCount() {
        return this.fragments.size();
    }
}



package com.manishkpr.viewpager;


import android.content.Context;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

public class ViewPagerAdapter extends FragmentPagerAdapter {
    private Context _context;

    public ViewPagerAdapter(Context context, FragmentManager fm) {
        super(fm);  
        _context=context;

        }
    @Override
    public Fragment getItem(int position) {
        Fragment f = new Fragment();
        switch(position){
        case 0:
            f=LayoutOne.newInstance(_context);  
            break;
        case 1:
            f=LayoutTwo.newInstance(_context);  
            break;
        }
        return f;
    }
    @Override
    public int getCount() {
        return 2;
    }

}

要显示左侧和右侧页面的预览,请设置以下两个值

  • viewpager.setCliptoppadding(false)
  • viewpager.setPadding(左、0、右、0)
  • 如果您需要在viewpager中的两个页面之间留出空间,请添加

    viewpager.setPageMargin(int);
    

    @jijuhoodan的答案是完美且有效的。然而,由于我对安卓系统比较陌生,我花了一段时间才理解并正确设置它。所以,我把这个答案贴出来,以备将来参考,并帮助任何和我处境相同的人

    if (viewPager == null) 
            {
    
                // Initializing view pager
                viewPager = (ViewPager) findViewById(R.id.vpLookBook);
    
                // Disable clip to padding
                viewPager.setClipToPadding(false);
                // set padding manually, the more you set the padding the more you see of prev & next page
                viewPager.setPadding(40, 0, 40, 0);
                // sets a margin b/w individual pages to ensure that there is a gap b/w them
                viewPager.setPageMargin(20);
            }
    
    无需在适配器中为
    ViewPager的
    页面设置任何宽度。在
    ViewPager
    中查看上一页和下一页不需要其他代码。不过,若要在每个页面的顶部和底部添加空白,可以将以下代码设置为
    ViewPager的
    子页面的父布局

    android:paddingTop="20dp"
    android:paddingBottom="20dp"
    


    这将是ViewPager的最终外观。

    在2017年,通过使用
    RecyclerView
    和(在v7支持库的25.1.0版本中添加)可以轻松实现这种行为: 

    不久前,我需要类似viewpager的功能,并准备了一个小型库:

    -您可以在那里找到所有代码和示例

    它主要由一个类文件(和两个xmls:and)组成


    希望它能帮助一些人并节省一些时间:)

    如果有人仍在寻找解决方案,我已经定制了ViewPage以实现它,而不使用负边距,请在此处查找示例项目 它在大多数情况下都应该有效,但您仍然可以使用
    mPager.setPageMargin(以像素为单位的边距)


    对于那些在不同屏幕上挣扎的用户

    mPager.setClipToPadding(false);
    DisplayMetrics displayMetrics = new DisplayMetrics();
    self.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
    int width = displayMetrics.widthPixels;
    int paddingToSet = width/4; //set this ratio according to how much of the next and previos screen you want to show.
    mPager.setPadding(paddingToSet,0,paddingToSet,0);
    
    

    您可以在xml文件中执行此操作,只需使用以下代码:

     android:clipToPadding="false"
     android:paddingLeft="XX"
     android:paddingRight="XX"
    
    例如:

    
    
    注意:如果页面之间需要空间,请将padding/margin设置为child fragments


    请注意,当将无零填充设置为viewpager时,viewpager的edgeeffect放置混乱,这是viewpager的一个错误,请参见此处:

    您可以通过在viewpager中设置android:overScrollMode=“never”
    来禁用边缘效果,也可以通过稍微修改版本的EdgeEffect类来修复此缺陷:使用新的ViewPager2解决方案 现在,你应该考虑使用“取代VIEPER,解决大多数前任的痛点”:

    • 基于RecyclerView
    • RTL(从右到左)布局支持
    • 垂直定向支架
    • 可靠的片段支持(包括处理对底层片段集合的更改)
    • 数据集更改动画(包括
      DiffUtil
      支持)
    结果

    代码 在活动/片段中,设置ViewPager2:

    // MyRecyclerViewAdapter is an standard RecyclerView.Adapter :)
    viewPager2.adapter = MyRecyclerViewAdapter() 
    
    // You need to retain one page on each side so that the next and previous items are visible
    viewPager2.offscreenPageLimit = 1
    
    // Add a PageTransformer that translates the next and previous items horizontally
    // towards the center of the screen, which makes them visible
    val nextItemVisiblePx = resources.getDimension(R.dimen.viewpager_next_item_visible)
    val currentItemHorizontalMarginPx = resources.getDimension(R.dimen.viewpager_current_item_horizontal_margin)
    val pageTranslationX = nextItemVisiblePx + currentItemHorizontalMarginPx
    val pageTransformer = ViewPager2.PageTransformer { page: View, position: Float ->
        page.translationX = -pageTranslationX * position
        // Next line scales the item's height. You can remove it if you don't want this effect
        page.scaleY = 1 - (0.25f * abs(position))
        // If you want a fading effect uncomment the next line:
        // page.alpha = 0.25f + (1 - abs(position))
    }
    viewPager2.setPageTransformer(pageTransformer)
    
    // The ItemDecoration gives the current (centered) item horizontal margin so that
    // it doesn't occupy the whole screen width. Without it the items overlap
    val itemDecoration = HorizontalMarginItemDecoration(
        context,
        R.dimen.viewpager_current_item_horizontal_margin
    )
    viewPager2.addItemDecoration(itemDecoration)
    
    添加
    HorizontalMarginItemDecoration
    ,这是一个微不足道的
    ItemDecoration

    /**
     * Adds margin to the left and right sides of the RecyclerView item.
     * Adapted from https://stackoverflow.com/a/27664023/4034572
     * @param horizontalMarginInDp the margin resource, in dp.
     */
    class HorizontalMarginItemDecoration(context: Context, @DimenRes horizontalMarginInDp: Int) :
        RecyclerView.ItemDecoration() {
    
        private val horizontalMarginInPx: Int =
            context.resources.getDimension(horizontalMarginInDp).toInt()
    
        override fun getItemOffsets(
            outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State
        ) {
            outRect.right = horizontalMarginInPx
            outRect.left = horizontalMarginInPx
        }
    
    }
    
    添加控制上一个/下一个项目可见程度和当前项目水平边距的尺寸:

    <dimen name="viewpager_next_item_visible">26dp</dimen>
    <dimen name="viewpager_current_item_horizontal_margin">42dp</dimen>
    
    重要的一点是:
    ViewPager2
    项必须具有
    layout\u height=“match\u parent”
    (否则会引发非法状态异常),因此您应该执行以下操作:

    <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent" <-- this!
        app:cardCornerRadius="8dp"
        app:cardUseCompatPadding="true">
    
        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="280dp">
    
            <!-- ... -->
    
        </androidx.constraintlayout.widget.ConstraintLayout>
    
    </androidx.cardview.widget.CardView>
    

    关于新的ViewPager2

    将此添加到适配器类文件中,这对我很有用

    好问题!我最近检查了源代码,我觉得如果您不想修改src代码,没有更好的方法。
    setPageMargin(-100)
    是否正常工作?GalleryView会做得更好,除非您使用的是带片段的ViewPger。我可以使用gallery view来完成这项工作。在任何方面都与viewpager相同。不知道为什么gallery会被拒绝这个问题已经在[post here][1][1]中被广泛讨论过了:我使用的是带碎片的Vierpager。所以我可以用同样的方法吗?是的,我同意你的观点Jiju IndustryHoodan。。欲了解更多信息,请参考和酷,它是如此简单:)有可能调整预览的左右大小切换页面的查看页面?例如,如果碎片失焦,它的比例将为~0.8,但当我们将其拖动到中心时,比例将增加到1,而中心视图中的前一个碎片在离开屏幕时将比例更改为0.8?这是可行的!但当我尝试缩放中心布局时,它会缩放到顶部和底部。由于填充,左侧和右侧不可见。请不要讨论这个问题,因为有时只需要寻呼机,但知道这个很好!谢谢分享!这太棒了。我已经有了大量的RecyclerView帮助代码。只需添加一个简单的
    新的PagerSnapHelper().attachToRecyclerView(recyclerView)
    ,我就可以进行页面快照。我投了反对票。对不起,兄弟。这次成功了!!在oreo设备上再次出现相同问题,填充开始和结束在其他设备上按预期工作,但在ViewPager2之后的oreo除外。PageTransformer解决了这个问题,填充仍然是一样的,我必须添加
    viewpager.setPageTransformer{page,position->page.translationX=-1*position}
    我必须稍微移动视图页面以获得此效果。没关系,我忘记添加这一行
    setOffscreenPageLimit(1)
    :)这在android中不起作用R@akubi不幸的是,我不能给你代码,因为它属于一家私人公司。但请注意,你有
    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    
    <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent" <-- this!
        app:cardCornerRadius="8dp"
        app:cardUseCompatPadding="true">
    
        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="280dp">
    
            <!-- ... -->
    
        </androidx.constraintlayout.widget.ConstraintLayout>
    
    </androidx.cardview.widget.CardView>
    
     override fun getPageWidth(position: Int): Float {
        return 0.7f
    }