我的目标是创建这个。
https://i.imgur.com/73fvhaf.gif
主要问题是,当我滚动该图像时,我无法将图像保持在1/4(或任何尺寸)的第一个位置,它将占据屏幕的完整宽度,然后充当正常的pageradapter。
我尝试了以下
- objectAnimator.Offloat
- 与边距,填充等一起玩
- 找到设置第一个图像边界的任何方法
- 设置空图片以将视图推到侧面,这似乎最可行,尽管我必须调用notifydatasetchanged();
当我在适配器中更改数据时,我将调用notifydatasetchanged();我们都知道在没有任何平稳过渡的情况下更新视图。
只要我知道如何为第一个图像设定边界,就感觉这应该具有简单干净的解决方案。也许我错了
这是我正在使用的代码我创建了一个自定义画廊小部件
public class ImageGalleryViewPager extends ViewPager {
public ImageGalleryViewPager(Context context) {
super(context);
setMyScroller();
}
public ImageGalleryViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
setMyScroller();
}
//down one is added for smooth scrolling
private void setMyScroller() {
try {
Class<?> viewpager = ViewPager.class;
Field scroller = viewpager.getDeclaredField("mScroller");
scroller.setAccessible(true);
scroller.set(this, new ImageGalleryViewPager.MyScroller(getContext()));
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void setAdapter(PagerAdapter adapter) {
super.setAdapter(adapter);
setCurrentItem(adapter.getCount());
}
public class MyScroller extends Scroller {
public MyScroller(Context context) {
super(context, new DecelerateInterpolator());
}
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
super.startScroll(startX, startY, dx, dy, 350 /*1 secs*/);
}
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev);
}
}
我在cardView
中使用它 <com.apirix.inspection.views.viewpagers.ImageGalleryViewPager
android:id="@+id/image_gallery_vp"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</android.support.v7.widget.CardView></RelativeLayout>
这是我的pageradapter
public AssignmentListGalleryAdapter(Context context, List<Media> medias, ViewPager horizontalView) {
mContext = context;
mMedias = medias;
mHorizontalView = horizontalView;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mItemView = inflater.inflate(R.layout.row_image_gallery_viewpager, container, false);
ButterKnife.bind(this, mItemView);
mUri = mMedias.get(position).getUrl();
closeAllImagesButton.add(mCloseButton);
mContainer = container;
container.setClipToPadding(false);
container.setPadding(30, 0, 60, 0);
if (!mUri.isEmpty()) {
Picasso.with(mContext)
.load(mUri)
.fit()
.into(mFullScreenImageView);
}
mCloseButton.setOnClickListener(this);
container.addView(mItemView);
return mItemView;
}
public int getItemPosition(Object object) {
return POSITION_NONE;
}
我认为您可以在卡片中使用填充,但仅适用于适配器的第一个元素。
因此,您将有两个卡视图:
row_image_gallery_viewpager_first.xml
<com.apirix.inspection.views.viewpagers.ImageGalleryViewPager
android:id="@+id/image_gallery_vp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingEnd="100dp"/>
和
row_image_gallery_viewpager.xml
<com.apirix.inspection.views.viewpagers.ImageGalleryViewPager
android:id="@+id/image_gallery_vp"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</android.support.v7.widget.CardView></RelativeLayout>
然后,您必须在适配器中指定第一个元素的XML使用:
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (position == 0){
mItemView = inflater.inflate(R.layout.row_image_gallery_viewpager_first, container, false);
} else {
mItemView = inflater.inflate(R.layout.row_image_gallery_viewpager, container, false);
}
ButterKnife.bind(this, mItemView);
希望这有效。