Android 将子视图与ViewPager的中心对齐

Android 将子视图与ViewPager的中心对齐,android,android-viewpager,center,Android,Android Viewpager,Center,我需要将子视图设置为ViewPager的中心,并且我希望在当前视图侧显示下一个和上一个视图的某些部分(如1下面的当前屏幕)。但当前视图是从ViewPager的左侧开始的(如2下面的预期屏幕)。我怎样才能做到这一点 这是我的密码 MyViewPagerAdapter public class MyViewPagerAdapter extends PagerAdapter { private Activity mActivity; private int mPageCount;

我需要将子视图设置为ViewPager的中心,并且我希望在当前视图侧显示下一个和上一个视图的某些部分(如1下面的当前屏幕)。但当前视图是从ViewPager的左侧开始的(如2下面的预期屏幕)。我怎样才能做到这一点

这是我的密码

MyViewPagerAdapter

public class MyViewPagerAdapter extends PagerAdapter {
    private Activity mActivity;
    private int mPageCount;
    public MyViewPagerAdapter(Activity activity,int pageCount) {
        mActivity = activity;
        mPageCount = pageCount;
    }

    @Override
    public int getCount() {
        return mPageCount;
    }

    @Override
    public boolean isViewFromObject(View view, Object obj) {
        return (view ==(View)obj);
    }

    @Override
    public Object instantiateItem(ViewGroup container,final int position) {
        ViewGroup viewGroup = (ViewGroup)mActivity.getLayoutInflater().inflate(
                R.layout.item_view, null);

        viewGroup.setBackgroundColor(randomColor());

        TextView textView = (TextView)viewGroup.findViewById(R.id.textView1);
        textView.setText("Page: "+(position+1));
        Button button = (Button) viewGroup.findViewById(R.id.button1);
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Toast.makeText(mActivity, "Hey, Its clicked!!! at page "+(position+1), Toast.LENGTH_LONG).show();
            }
        });
        container.addView(viewGroup);
        return viewGroup;
    }

    Random rnd = new Random();
    private int randomColor(){
        return Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));
    }

    @Override
    public void destroyItem(ViewGroup collection, int position, Object view) {
        //must be overridden else throws exception as not overridden.
        Log.d("Tag", collection.getChildCount()+"");
        collection.removeView((View) view);
    }

    @Override
    public float getPageWidth(int position) {
        return 0.8f;
    }
}
main活动

public class MainActivity extends Activity {
    private ViewPager viewPager;
    LinearLayout linearLayout;
    private int ID = 100; 

    private final int count = 8;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        viewPager = (ViewPager) findViewById(R.id.viewPager);
        linearLayout  = (LinearLayout) findViewById(R.id.indicator_layout);
        generateIndicators(count);


        MyViewPagerAdapter adapter = new MyViewPagerAdapter(this, count);
        viewPager.setAdapter(adapter);
        viewPager.setOnPageChangeListener(new OnPageChangeListener() {
            int oldPosition = 0;
            @Override
            public void onPageSelected(int position) {
                //this changes the old position's view state image
                ((TextView)linearLayout.getChildAt(oldPosition)).setText("");
                oldPosition = position;


                //this changes the current position's view state image
                ((TextView)linearLayout.getChildAt(position)).setText((position+1)+"");

            }
            //this method will be called repeatedly upto another item comes as front one(active one)
            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {


            }
            //this will be called as per scroll state
            @Override
            public void onPageScrollStateChanged(int arg0) {


            }
        });

        viewPager.setOffscreenPageLimit(4);

    }

    private void generateIndicators(int count) {
        /// Converts 14 dip into its equivalent px
        int padd = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 3, getResources().getDisplayMetrics());

        for(int i=0;i<count;i++){
            TextView textView = new TextView(this);
            textView.setId(ID+i);
            final int currentItem = i;
            textView.setBackgroundResource(R.drawable.white_cell);
            textView.setPadding(padd,padd,padd,padd);
            /// Converts 14 dip into its equivalent px
            int size = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, getResources().getDisplayMetrics());
            textView.setTextSize(size);
            textView.setGravity(Gravity.CENTER);
            /// Converts 14 dip into its equivalent px
            int px = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 30, getResources().getDisplayMetrics());

            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(px, px);
            linearLayout.addView(textView,params);
        }

        ((TextView)linearLayout.getChildAt(0)).setText("1");

    }





}
公共类MainActivity扩展活动{
私人视页机视页机;
线性布局线性布局;
私有int ID=100;
私人最终整数计数=8;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager=(viewPager)findViewById(R.id.viewPager);
linearLayout=(linearLayout)findViewById(R.id.indicator\U布局);
发电机指示器(计数);
MyViewPagerAdapter适配器=新的MyViewPagerAdapter(此,计数);
viewPager.setAdapter(适配器);
viewPager.setOnPageChangeListener(新的OnPageChangeListener(){
int oldPosition=0;
@凌驾
已选择页面上的公共无效(内部位置){
//这将更改旧位置的视图状态图像
((TextView)linearLayout.getChildAt(oldPosition)).setText(“”);
oldPosition=位置;
//这将更改当前位置的视图状态图像
((TextView)linearLayout.getChildAt(position)).setText((position+1)+”);
}
//此方法将被重复调用,直到另一项作为前一项(活动项)出现
@凌驾
已滚动页面上的公共void(int arg0、float arg1、int arg2){
}
//这将根据滚动状态调用
@凌驾
公共无效onPageScrollStateChanged(int arg0){
}
});
viewPager.setOffscreenPageLimit(4);
}
专用无效生成器指示器(整数计数){
///将14 dip转换为其等效px
int padd=(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,3,getResources().getDisplayMetrics());

对于(int i=0;i对于一个应用程序,我使用标准的
ViewPager
实现了类似的方法:

  • 使页面全屏显示内部布局中的实际内容。例如,将全屏布局设置为透明背景的
    RelativeLayout
    ,将实际内容设置为另一个
    RelativeLayout
    ,以父级为中心。如果我没记错的话,这是因为仅将内部布局作为页面
    ViewPager
    不会占据某些设备(如Galaxy Nexus)的全部屏幕宽度

  • 使用
    ViewPager.setPageMargin()
    设置负页边距,即要显示下一页/上一页的多少。确保它仅与父全屏布局的透明区域重叠

  • 调用
    ViewPager.setOffscreenPageLimit()
    将屏幕外页面计数从默认值
    1
    调整为至少
    2,以确保通过真正在屏幕外创建页面来平滑分页。否则,您将看到在屏幕上已经部分显示的情况下绘制下一页/上一页


扩展HorizontalScrollView类作为滚动视图的父级。在onMeasure()中方法您可以指定每个子视图的宽度和高度。这种方法有点麻烦,但效果会很好,您可以很好地控制您的子视图。

对于任何对OP没有用解决方案更新其问题感到不安的人,这里有一个链接,它以最小的努力解释了如何用XML实现这一点:


基本上,当您用XML声明viewpager时,给它相同的左、右填充,并设置android:clipToPadding=“false”。(他的XML示例中缺少clipToPadding,这是实现此效果所必需的)

最后,我在GitHub中添加了这个问题的解决方案。我已经做了一些非常巧妙的技巧来获得解决方案。你可以从下面的链接获得这个项目(实际上我已经计划创建一个带有解释的博客,但我没有那么多时间去做)

这是()

您必须将文件从
com.noundla.centerviewpagersample.comps
包复制到项目中。您可以在
MainActivity
类中查看该Viewpager的用法


如果有人对此有问题,请告诉我。

我必须将当前页面居中,并使用不同的页面宽度,因此使用填充的解决方案不合适。此外,用户滚动被禁用(它是选项卡栏视图页面,由另一个视图页面滚动).这里有一个非常简单的解决方案-只需像下面这样覆盖ViewPager.ScrollTo方法(C#代码,Xamarin):

如果您计算每个片段的页面宽度,请不要忘记将它们缓存在数组中。

我在下面使用的代码中找到了解决方案:

// Offset between sibling pages in dp
int pageOffset = 20;

// Visible part of sibling pages at the edges in dp
int sidePageVisibleWidth = 10;

// Horizontal padding will be
int horPadding = pageOffset + sidePageVisibleWidth;

// Apply parameters
viewPager.setClipToPadding(false);
viewPager.setPageMargin(UIUtil.dpToPx(pageOffset, getContext()));
viewPager.setPadding(UIUtil.dpToPx(horPadding, getContext()), 0, UIUtil.dpToPx(horPadding, getContext()), 0);
dpToPx代码:

 public static int dpToPx(int dp, Context context) {
        float density = context.getResources().getDisplayMetrics().density;
        return Math.round((float) dp * density);
    }

这就是您所需要的全部内容

您可以对viewPager使用填充,并将clipToPadding设置为false

Java

viewPager.setClipToPadding(false);
viewPager.setPadding(50, 0, 50, 0);
Kotlin

 viewPager.clipToPadding = false
 viewPager.setPadding(50, 0, 50, 0)

我现在已经通过定制ViewPager完成了。你完成了吗?我面临着同样的问题@noundlayes。给我你的邮件id,我可以将其发送给你。非常感谢。我的地址:wangbourne@gmail.comI给你发邮件。检查一下,让我知道。谢谢你的回答。我不认为这能给我预期的结果,因为这些观点应该是正确的如果我们提供页边空白,则不会出现在旁边。但是,我是通过自定义ViewPager类中的scrollToItem()方法来实现的。我本想发布我的ViewPager类,但它有更多字符,因此,我无法在此处发布答案。我想结束这个问题。这是我如何使用FrameLayouts完成的。
 public static int dpToPx(int dp, Context context) {
        float density = context.getResources().getDisplayMetrics().density;
        return Math.round((float) dp * density);
    }
viewPager.setClipToPadding(false);
viewPager.setPadding(50, 0, 50, 0);
 viewPager.clipToPadding = false
 viewPager.setPadding(50, 0, 50, 0)