Android-使用Pageradapter,我想使第一个图像显示屏幕的1/4,然后让其自然滚动



我的目标是创建这个。

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);

希望这有效。

最新更新