有没有办法在android中创建预览滑块

编程入门 行业动态 更新时间:2024-10-25 18:34:14
本文介绍了有没有办法在android中创建预览滑块的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在尝试创建像

这样的界面

.

中心元素是带有全尺寸图像的 ViewPager,顶部元素是带有预览图像的 RecyclerView.但是我找不到将元素吸引到中心的方法.有没有办法覆盖 RecyclerView 的行为?

解决方案

我找到了正是您需要的解决方案.我在 github 上创建了一个小例子:

问题是顶视图是 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: 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中创建预览滑块

本文发布于:2023-11-24 10:23:59,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1624827.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:没有办法   滑块   android

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!