android – 使用NestedScrollView处理VerticalViewPager的滚动

android – 使用NestedScrollView处理VerticalViewPager的滚动,第1张

概述背景: 我使用的是ViewPager的变体,它不是在水平方向上滚动,而是在垂直方向上滚动. VerticalViewPager: https://android.googlesource.com/platform/packages/apps/DeskClock/+/master/src/com/android/deskclock/VerticalViewPager.java android.sup 背景:

我使用的是VIEwPager的变体,它不是在水平方向上滚动,而是在垂直方向上滚动.

VerticalVIEwPager:
https://android.googlesource.com/platform/packages/apps/DeskClock/+/master/src/com/android/deskclock/VerticalViewPager.java

androID.support.v4.app.FragmentStatePagerAdapter用于设置VerticalVIEwPager中的内容.

每次调用FragmentStatePagerAdapter的getItem()时,我都会从FragmentStatePagerAdapter创建并返回一个新的androID.support.v4.app.Fragment实例,如下所示:

@H_403_11@@OverrIDepublic Fragment getItem(int position) { return PrevIEwFragment.getNewFragmentInstance(position);}

PrevIEwFragment呈现可能不适合屏幕的内容.
为了显示不适合屏幕的所有内容,androID.support.v4.Widget.nestedScrollVIEw用作PrevIEwFragment布局的父元素.

问题:

PrevIEwFragment的内容按预期滚动到位置0.
但是,为了切换到下一页,必须多次执行甩动或滑动 *** 作,因此向位置1的页面滑动是非常困难的.

此外,投掷或滑回到位置0非常困难或几乎不可能.

需要:

Fling或滑动或切换到PrevIEwFragment的下一个实例应该是平滑的.
换句话说,滚动内容应该是平滑的,同时请记住,滑动到下一页也应该顺利工作.

Link to the sample project as mentioned above

解决方法 我查看了你的 Github代码.我让它适合你.我也发了拉请求.问题是onIntercepttouchEvent如果返回true则使VIEwPager滚动,如果我们返回false,则禁用VIEwPager touch并使nestedScrollVIEw滚动.所以我在这里检查是否需要滚动nestedScrollVIEw然后如果nestedScrollVIEw位于顶部或底部我返回false,我将其返回true.我在这里发布代码.您可以修改它并使其更干净.

Github link – https://github.com/karanatwal/vertical-viewpager-nestedscrollview

以下是VerticalVIEwPager代码 –

@H_403_11@@OverrIDepublic boolean onIntercepttouchEvent(MotionEvent ev) { boolean toIntercept = super.onIntercepttouchEvent(flipXY(ev)); // Return MotionEvent to normal float x = ev.getX(); flipXY(ev); int direction=1; switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: mStartDragX = x; break; case MotionEvent.ACTION_MOVE: if (mStartDragX < x ) { direction=-1; } else if (mStartDragX > x) { direction=1; } MainActivity.MyPagerAdapter adapter = (MainActivity.MyPagerAdapter)this.getAdapter(); if (adapter.getCurrentFragment() instanceof FragmentVIEwPager){ FragmentVIEwPager fragmentVIEwPager = (FragmentVIEwPager)adapter.getCurrentFragment(); toIntercept = !fragmentVIEwPager.getnestedScrollVIEw().canScrollVertically(direction); int range = fragmentVIEwPager.getnestedScrollVIEw().computeVerticalScrollRange(); int offset = fragmentVIEwPager.getnestedScrollVIEw().computeVerticalScrollOffset(); int extent = fragmentVIEwPager.getnestedScrollVIEw().computeVerticalScrollExtent(); int percentage = (int)(100.0 * offset / (float)(range - extent)); System.out.println(" range: "+range); System.out.print(" offset: "+offset); System.out.print(" extent: "+extent); System.out.print(" percentage: "+percentage); System.out.print(" direction: "+direction); if (fragmentVIEwPager.getnestedScrollVIEw().computeVerticalScrollOffset()==0 && direction==-1){ //top return true; } else if (percentage>99 && direction==1){ //bottom return true; }else { //scroll nestedscrollvIEw return false; } } break; } return toIntercept;}

你的MyPagerAdapter –

@H_403_11@public class MyPagerAdapter extends FragmentStatePagerAdapter { public MyPagerAdapter(FragmentManager fm) { super(fm); } private Fragment mCurrentFragment; public Fragment getCurrentFragment() { return mCurrentFragment; } //... @OverrIDe public voID setPrimaryItem(VIEwGroup container,int position,Object object) { if (getCurrentFragment() != object) { mCurrentFragment = ((Fragment) object); } super.setPrimaryItem(container,position,object); } @OverrIDe public androID.support.v4.app.Fragment getItem(int pos) { switch (pos) { case 0: return FragmentVIEwPager.newInstance("Title Start",R.drawable.ic_launcher_background); case 1: return FragmentVIEwPager.newInstance("Rock",R.drawable.rock); case 2: return FragmentVIEwPager.newInstance("Paper",R.drawable.paper); case 3: return FragmentVIEwPager.newInstance("Scissors",R.drawable.scissors); case 4: return FragmentVIEwPager.newInstance("Title End",R.drawable.ic_launcher_background); default: return FragmentVIEwPager.newInstance("Default Title",R.drawable.rock); } } @OverrIDe public int getCount() { return 5; }}

为了避免受限制的API方法 – 使用以下逻辑作为替代

@H_403_11@//offset,range and extent int scrollY = scrollVIEw.getScrollY(); int scrollContentHeight = scrollVIEw.getChildAt(0).getHeight(); int screenHeight = Utility.getScreenHeight(context); int statusbarHeight = Utility.getStatusbarHeight(context); double percent = ((((float) scrollY) / ((float) (scrollContentHeight - screenHeight + statusbarHeight))));

您只需要滚动百分比和滑动方向.在SO上找到滚动百分比和滑动方向有很多问题,如this和this.你应该为它做一点R& D.

总结

以上是内存溢出为你收集整理的android – 使用NestedScrollView处理VerticalViewPager的滚动全部内容,希望文章能够帮你解决android – 使用NestedScrollView处理VerticalViewPager的滚动所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1136574.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存