上图就是效果图,设置起来其实很简单,现在xml文件中进行如下设置:
<androidx.viewpager.widget.ViewPager
android:layout_width="match_parent"
android:id="@+id/vp_Ad_Container"
android:clipToPadding="false"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:gravity="center_horizontal"
android:layout_height="300dp"/>
再在代码中设置margin,特别提示:在xml文件中设置margin无效
//设置边距5dp
mViewPager.setPageMargin( dip2px(5));
//dp转px的函数
private int dip2px(int value) {
final float scale = getResources().getDisplayMetrics().density;
return (int)(value * scale + 0.5f);
}
到这里就设置完成了,下面解释一下原理:
android:clipToPadding此属性表示: 用来定义ViewGroup是否允许在padding中绘制。默认情况下为true,为true的情况下, 那么绘制的区域会把padding部分剪裁。若为false,那么控件的绘制区域包含padding部分。
ViewPager部分源码:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// For simple implementation, our internal size is always 0.
// We depend on the container to specify the layout size of
// our view. We can't really know what it is since we will be
// adding and removing different arbitrary views and do not
// want the layout to change as this happens.
setMeasuredDimension(getDefaultSize(0, widthMeasureSpec),
getDefaultSize(0, heightMeasureSpec));
final int measuredWidth = getMeasuredWidth();
final int maxGutterSize = measuredWidth / 10;
mGutterSize = Math.min(maxGutterSize, mDefaultGutterSize);
// Children are just made to fill our space.
int childWidthSize = measuredWidth - getPaddingLeft() - getPaddingRight();
int childHeightSize = getMeasuredHeight() - getPaddingTop() - getPaddingBottom();
默认情况下,childWidthSize就是页面item的宽度了,等于ViewPager的宽度减去左右Padding。我们给ViewPager设置了左右Padding,页面的宽度就变小了,设置clipToPadding=false,则padding部分可以绘制显示,那么左右的item也就显示出来了。 另外,设置item的间距,viewPager.setPageMargin(dp2px(5)).
api解释一下xml属性:
翻译一下: