有没有办法在android中创建预览滑块 [英] Is there a way to create preview slider in android
问题描述
我正在尝试创建像
这样的界面.
中心元素是带有全尺寸图像的 ViewPager
,顶部元素是带有预览图像的 RecyclerView
.但是我找不到将元素吸引到中心的方法.有没有办法覆盖 RecyclerView
的行为?
我找到了正是您需要的解决方案.我在 github.com 上创建了一个小例子:
问题是顶视图是 ViewPager
而中心视图也是 ViewPager
.详细代码如下:
顶部预览适配器
public class PhotoPreviewAdapter extends FragmentPagerAdapter {私有静态最终 int DEFAULT_SIDE_PREVIEW_COUNT = 3;私人最终 int sidePreviewCount;私人最终名单<PhotoInfo>照片信息;公共 PhotoPreviewAdapter(FragmentManager fm, List photoInfos) {这(FM,DEFAULT_SIDE_PREVIEW_COUNT,photoInfos);}public PhotoPreviewAdapter(FragmentManager fm, int sidePreviewCount, List photoInfos) {超级(调频);this.sidePreviewCount = sidePreviewCount;this.photoInfos = photoInfos;}公共 int getSidePreviewCount() {返回 sidePreviewCount;}@覆盖公共片段 getItem(int position) {如果(isDummy(位置)){返回 DummyPreviewFragment.newInstance();} 别的 {返回 PhotoPreviewFragment.newInstance(photoInfos.get(getRealPosition(position)));}}私有布尔值 isDummy(int position) {返回位置<sidePreviewCount ||位置 >photoInfos.size() - 1 + sidePreviewCount;}私人 int getRealPosition(int position) {返回位置 - sidePreviewCount;}@覆盖公共 int getCount() {返回 photoInfos.size() + (sidePreviewCount * 2);}@覆盖公共浮动 getPageWidth(int position) {返回 1.0f/getElementsPerPage();}私有 int getElementsPerPage() {返回 (sidePreviewCount * 2) + 1;}}
中央视图适配器很简单
public class PhotoViewAdapter extends FragmentPagerAdapter {私人最终名单<PhotoInfo>照片信息;公共 PhotoViewAdapter(FragmentManager fm, List photoInfos) {超级(调频);this.photoInfos = photoInfos;}@覆盖公共片段 getItem(int position) {返回 PhotoViewFragment.newInstance(photoInfos.get(position));}@覆盖公共 int getCount() {返回 photoInfos.size();}}
其中一个主要是同步监听器
公共类 OnSyncPageChangeListener 实现 ViewPager.OnPageChangeListener {private int scrollState = ViewPager.SCROLL_STATE_IDLE;私有最终 ViewPager syncToViewPager;私有最终 ViewPager syncWithViewPager;公共 OnSyncPageChangeListener(ViewPager syncToViewPager, ViewPager syncWithViewPager) {this.syncToViewPager = syncToViewPager;this.syncWithViewPager = syncWithViewPager;}@覆盖public void onPageScrolled(final int position, final float positionOffset, final int positionOffsetPixels) {如果(滚动状态!= ViewPager.SCROLL_STATE_IDLE){最终浮动比率 = calculateRatioForPosition(position);final float scrollX = syncWithViewPager.getScrollX();final float scrollY = syncWithViewPager.getScrollY();syncToViewPager.scrollTo((int) (scrollX * ratio), (int) scrollY);}}私人浮点计算RatioForPosition(整数位置){最终浮动 syncToViewPagerWidth = syncToViewPager.getWidth();最终浮动 syncWithViewPagerWidth = syncWithViewPager.getWidth();最终浮动 syncToViewPagerElementWeight = syncToViewPager.getAdapter().getPageWidth(position);最终浮动 syncWithViewPagerElementWeight = syncWithViewPager.getAdapter().getPageWidth(position);最终浮动 syncToViewPagerElementsCount = (1.0f/syncToViewPagerElementWeight);最终浮动 syncWithViewPagerElementsCount = (1.0f/syncWithViewPagerElementWeight);最终浮动 syncToViewPagerElementWidth = syncToViewPagerWidth/syncToViewPagerElementsCount;最终浮动 syncWithViewPagerElementWidth = syncWithViewPagerWidth/syncWithViewPagerElementsCount;返回 syncToViewPagerElementWidth/syncWithViewPagerElementWidth;}@覆盖公共无效 onPageSelected(最终 int 位置){}@覆盖public void onPageScrollStateChanged(final int state) {滚动状态 = 状态;如果(状态== ViewPager.SCROLL_STATE_IDLE){syncToViewPager.setCurrentItem(syncWithViewPager.getCurrentItem(), false);}}}
最后init ViewPager
的
@Bind(R.id.photoPreviewPager)ViewPager photoPreviewPager;@Bind(R.id.photoViewPager)ViewPager photoViewPager;@覆盖protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ButterKnife.bind(this);最终名单<PhotoInfo>photoInfos = PhotoInfosProvider.generate();final PhotoPreviewAdapter photoPreviewAdapter = new PhotoPreviewAdapter(getSupportFragmentManager(), photoInfos);final PhotoViewAdapter photoViewAdapter = new PhotoViewAdapter(getSupportFragmentManager(), photoInfos);photoPreviewPager.setAdapter(photoPreviewAdapter);photoPreviewPager.addOnPageChangeListener(new OnSyncPageChangeListener(photoViewPager, photoPreviewPager));photoViewPager.setAdapter(photoViewAdapter);photoViewPager.setOffscreenPageLimit(photoPreviewAdapter.getSidePreviewCount() * 2 + 1);photoViewPager.addOnPageChangeListener(new OnSyncPageChangeListener(photoPreviewPager, photoViewPager));}
更详细的代码在repo
I'm trying to create interface like
.
Central element is ViewPager
with full-size image, top element is RecyclerView
with preview images. But I couldn't find the way to magnet elements to center. Is there way to override behavior of RecyclerView
?
I found the solution exactly what you need. I created a small example on github.com: AndroidPreviewSlider
The thing is that top view is ViewPager
and center view is ViewPager
too.
Detailed code is below:
Adapter for top preview
public class PhotoPreviewAdapter extends FragmentPagerAdapter {
private static final int DEFAULT_SIDE_PREVIEW_COUNT = 3;
private final int sidePreviewCount;
private final List<PhotoInfo> photoInfos;
public PhotoPreviewAdapter(FragmentManager fm, List<PhotoInfo> photoInfos) {
this(fm, DEFAULT_SIDE_PREVIEW_COUNT, photoInfos);
}
public PhotoPreviewAdapter(FragmentManager fm, int sidePreviewCount, List<PhotoInfo> photoInfos) {
super(fm);
this.sidePreviewCount = sidePreviewCount;
this.photoInfos = photoInfos;
}
public int getSidePreviewCount() {
return sidePreviewCount;
}
@Override
public Fragment getItem(int position) {
if (isDummy(position)) {
return DummyPreviewFragment.newInstance();
} else {
return PhotoPreviewFragment.newInstance(photoInfos.get(getRealPosition(position)));
}
}
private boolean isDummy(int position) {
return position < sidePreviewCount || position > photoInfos.size() - 1 + sidePreviewCount;
}
private int getRealPosition(int position) {
return position - sidePreviewCount;
}
@Override
public int getCount() {
return photoInfos.size() + (sidePreviewCount * 2);
}
@Override
public float getPageWidth(int position) {
return 1.0f / getElementsPerPage();
}
private int getElementsPerPage() {
return (sidePreviewCount * 2) + 1;
}
}
Adapter for central view is simple
public class PhotoViewAdapter extends FragmentPagerAdapter {
private final List<PhotoInfo> photoInfos;
public PhotoViewAdapter(FragmentManager fm, List<PhotoInfo> photoInfos) {
super(fm);
this.photoInfos = photoInfos;
}
@Override
public Fragment getItem(int position) {
return PhotoViewFragment.newInstance(photoInfos.get(position));
}
@Override
public int getCount() {
return photoInfos.size();
}
}
And one of the main is sync listener
public class OnSyncPageChangeListener implements ViewPager.OnPageChangeListener {
private int scrollState = ViewPager.SCROLL_STATE_IDLE;
private final ViewPager syncToViewPager;
private final ViewPager syncWithViewPager;
public OnSyncPageChangeListener(ViewPager syncToViewPager, ViewPager syncWithViewPager) {
this.syncToViewPager = syncToViewPager;
this.syncWithViewPager = syncWithViewPager;
}
@Override
public void onPageScrolled(final int position, final float positionOffset, final int positionOffsetPixels) {
if (scrollState != ViewPager.SCROLL_STATE_IDLE) {
final float ratio = calculateRatioForPosition(position);
final float scrollX = syncWithViewPager.getScrollX();
final float scrollY = syncWithViewPager.getScrollY();
syncToViewPager.scrollTo((int) (scrollX * ratio), (int) scrollY);
}
}
private float calculateRatioForPosition(int position) {
final float syncToViewPagerWidth = syncToViewPager.getWidth();
final float syncWithViewPagerWidth = syncWithViewPager.getWidth();
final float syncToViewPagerElementWeight = syncToViewPager.getAdapter().getPageWidth(position);
final float syncWithViewPagerElementWeight = syncWithViewPager.getAdapter().getPageWidth(position);
final float syncToViewPagerElementsCount = (1.0f / syncToViewPagerElementWeight);
final float syncWithViewPagerElementsCount = (1.0f / syncWithViewPagerElementWeight);
final float syncToViewPagerElementWidth = syncToViewPagerWidth / syncToViewPagerElementsCount;
final float syncWithViewPagerElementWidth = syncWithViewPagerWidth / syncWithViewPagerElementsCount;
return syncToViewPagerElementWidth / syncWithViewPagerElementWidth;
}
@Override
public void onPageSelected(final int position) {
}
@Override
public void onPageScrollStateChanged(final int state) {
scrollState = state;
if (state == ViewPager.SCROLL_STATE_IDLE) {
syncToViewPager.setCurrentItem(syncWithViewPager.getCurrentItem(), false);
}
}
}
And finally init ViewPager
's
@Bind(R.id.photoPreviewPager)
ViewPager photoPreviewPager;
@Bind(R.id.photoViewPager)
ViewPager photoViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
final List<PhotoInfo> photoInfos = PhotoInfosProvider.generate();
final PhotoPreviewAdapter photoPreviewAdapter = new PhotoPreviewAdapter(getSupportFragmentManager(), photoInfos);
final PhotoViewAdapter photoViewAdapter = new PhotoViewAdapter(getSupportFragmentManager(), photoInfos);
photoPreviewPager.setAdapter(photoPreviewAdapter);
photoPreviewPager.addOnPageChangeListener(new OnSyncPageChangeListener(photoViewPager, photoPreviewPager));
photoViewPager.setAdapter(photoViewAdapter);
photoViewPager.setOffscreenPageLimit(photoPreviewAdapter.getSidePreviewCount() * 2 + 1);
photoViewPager.addOnPageChangeListener(new OnSyncPageChangeListener(photoPreviewPager, photoViewPager));
}
More detailed code is in repo
这篇关于有没有办法在android中创建预览滑块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!