首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

安卓ViewPager:仅当前一项滚动到90%时才滚动到下一项

安卓ViewPager是Android开发中常用的一个视图容器,用于展示多个页面,并支持滑动切换页面的功能。它是Android Support Library中的一个组件,可以在不同版本的Android系统上使用。

在默认情况下,ViewPager会在当前页面滑动到一定比例时就开始滚动到下一个页面。而根据问题描述,需要实现的是仅当当前页面滚动到90%时才滚动到下一个页面。

为了实现这个需求,可以通过自定义一个继承自ViewPager的子类,并重写其滑动监听方法来实现。具体步骤如下:

  1. 创建一个自定义的ViewPager子类,例如CustomViewPager。
代码语言:txt
复制
public class CustomViewPager extends ViewPager {
    private static final float SCROLL_THRESHOLD = 0.9f; // 滚动阈值,即滚动到90%时开始滚动到下一项

    public CustomViewPager(Context context) {
        super(context);
    }

    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return super.onTouchEvent(event);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return super.onInterceptTouchEvent(event);
    }

    @Override
    public void setCurrentItem(int item) {
        super.setCurrentItem(item);
    }

    @Override
    public void setCurrentItem(int item, boolean smoothScroll) {
        super.setCurrentItem(item, smoothScroll);
    }

    @Override
    public void scrollTo(int x, int y) {
        super.scrollTo(x, y);
    }

    @Override
    public void scrollTo(int x, int y, int duration) {
        super.scrollTo(x, y, duration);
    }

    @Override
    public void computeScroll() {
        super.computeScroll();
    }

    @Override
    public void setOnPageChangeListener(OnPageChangeListener listener) {
        super.setOnPageChangeListener(listener);
    }

    @Override
    public void addOnPageChangeListener(OnPageChangeListener listener) {
        super.addOnPageChangeListener(listener);
    }

    @Override
    public void removeOnPageChangeListener(OnPageChangeListener listener) {
        super.removeOnPageChangeListener(listener);
    }

    @Override
    public void clearOnPageChangeListeners() {
        super.clearOnPageChangeListeners();
    }

    @Override
    public void setPageTransformer(boolean reverseDrawingOrder, PageTransformer transformer) {
        super.setPageTransformer(reverseDrawingOrder, transformer);
    }

    @Override
    public void setPageTransformer(boolean reverseDrawingOrder, PageTransformer transformer, int pageLayerType) {
        super.setPageTransformer(reverseDrawingOrder, transformer, pageLayerType);
    }

    @Override
    public void setAdapter(PagerAdapter adapter) {
        super.setAdapter(adapter);
    }

    @Override
    public PagerAdapter getAdapter() {
        return super.getAdapter();
    }

    @Override
    public void setOnAdapterChangeListener(OnAdapterChangeListener listener) {
        super.setOnAdapterChangeListener(listener);
    }

    @Override
    public int getCurrentItem() {
        return super.getCurrentItem();
    }

    @Override
    public void setOffscreenPageLimit(int limit) {
        super.setOffscreenPageLimit(limit);
    }

    @Override
    public int getOffscreenPageLimit() {
        return super.getOffscreenPageLimit();
    }

    @Override
    public void setPageMargin(int marginPixels) {
        super.setPageMargin(marginPixels);
    }

    @Override
    public int getPageMargin() {
        return super.getPageMargin();
    }

    @Override
    public void setPageMarginDrawable(Drawable d) {
        super.setPageMarginDrawable(d);
    }

    @Override
    public void setPageMarginDrawable(int resId) {
        super.setPageMarginDrawable(resId);
    }

    @Override
    public Parcelable onSaveInstanceState() {
        return super.onSaveInstanceState();
    }

    @Override
    public void onRestoreInstanceState(Parcelable state) {
        super.onRestoreInstanceState(state);
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
    }
}
  1. 在CustomViewPager类中,重写onTouchEvent方法,监听滑动事件。
代码语言:txt
复制
@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_MOVE) {
        int currentItem = getCurrentItem();
        int totalItemCount = getAdapter().getCount();
        float scrollOffset = (float) getScrollX() / getWidth();
        float currentItemOffset = (float) currentItem / totalItemCount;
        float nextItemOffset = (float) (currentItem + 1) / totalItemCount;

        if (scrollOffset >= currentItemOffset + (nextItemOffset - currentItemOffset) * SCROLL_THRESHOLD) {
            setCurrentItem(currentItem + 1, true);
        }
    }

    return super.onTouchEvent(event);
}
  1. 在使用ViewPager的地方,将原来的ViewPager替换为CustomViewPager。
代码语言:txt
复制
CustomViewPager viewPager = findViewById(R.id.viewPager);

通过以上步骤,就可以实现仅当当前页面滚动到90%时才滚动到下一个页面的效果。

关于安卓ViewPager的概念、分类、优势、应用场景以及腾讯云相关产品和产品介绍链接地址,由于题目要求不能提及特定的云计算品牌商,所以无法提供相关信息。但是,ViewPager作为Android开发中常用的视图容器,可以用于实现图片轮播、引导页展示、内容分页等功能,具有灵活性和易用性,广泛应用于移动应用开发中。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【盟友分享】vim学习之路-vim基本操作

q 强制退出文件 vim中不同保存退出是有区别的 :x 写入文件并退出(当文件被修改时写入,并更新文件和修改时间;否则不会更新文件修改时间) :wq和ZZ 强制写入并退出(文件没有被修改也强制写入...$ 移动到结尾 w 移动到下一个单词开头 e 移动到下一个单词结尾 fx 移动到本行之后第一个出现x字母的位置 tx 移动到本行之后第一个出现x字母的前一个位置 gg 跳到文件首 G 跳到文件尾 nG...相当于显示文本的窗口向上半屏。光标所处的行数随滚屏而改变。 CTRL-D使文本向上滚动半屏。相当于显示文本的窗口向下半屏。光标所处的行数随滚屏而改变。 CTRL-E使文本向上滚动一行。...i 进入插入模式,当前插入光标位置插入 a 进入插入模式,下一个光标位置插入 o 进入插入模式,在当前下一行插入 O 进入插入模式,在当前行上一行插入 可配置vim成鼠标光标定位模式 可视化模式 :...后添加外部命令 查找 :/ 在/后添加要查找的内容,进入查找,按n查找下一个,N查找上一个

2.1K60
  • H5页面前端开发常见的兼容性问题解决方法

    IOS系统下输入框光标高度不正常 问题描述:input输入框光标,在手机上显示没有问题,但是在苹果手机上当点击输入的时候,光标的高度和父盒子的高度一样,看起来很怪异。...解决办法:在输入框失失去焦点的时候添加一个事件,让页面回。...弹出的键盘遮盖文本框 问题描述:微信H5弹出软键盘后挡住input输入框,看不到输入的字符。如下左图是期待唤起键盘的时候样子,右边是实际唤起键的样子。...解决办法:给input和textarea标签添加focus事件,先判断是不是手机下的操作,当然,也可以不用判断机型,Document 对象属性和方法setTimeout延时0.5秒,因为调用键盘有一点迟钝...document.activeElement.scrollIntoView(); }, 500); } } Element.scrollIntoView()方法让当前的元素滚动到浏览器窗口的可视区域内

    2.7K10

    十六年全栈开发者的 Android 开发踩坑实录

    而在最近几年的工作项目中,作者第一次成为了一名开发者。在经过一段时间的磨合之后,作者意识到,从 web 开发转型到、移动端应用开发,开发者的思维也需要一定转换。...app 的现有用户可能已经通过其他的 app 习惯了应用内更新功能,甚至会理所应当地认为这其实应该是移动端平台的一项特点之一。但实际上,直到我亲身经历了开发,知道原来这项功能还要开发者手动添加。...我们在 app 出厂两年后开始限制 API 密钥。然而在限制之后,app 的一个地图功能罢工了。回更改之后,我们费了好大一番功夫找到问题所在。...优先离线的结构会将更改内容写入本地数据库,等有网络连接再进行同步。这样一来,用户得以在离线下使用 app,联网响应也会更快,用户不用再干巴巴地等着服务器传回响应才能进行下一步操作。 ?...谨慎选择导航 如果你的 app 结构复杂、有很多界面的话,开发进程到后期再去修改导航麻烦程度将超乎你的想象。我们的 app 在后期是直接改为了底部导航的形式。

    1.1K40

    linux(五)之vi编译器

    键入命令:q,如vi发现文本内容已被更改,将提示用户使用“:quit”命令退出。...四、Vi编译器常用的命令  3.1、在文件中移动光标 h:向左移动一个字符 l:向右移动一个字符 k:向上移动一行 j:向下移动一行 ^(即Shift+6):移动到当前行的开头处...$(即Shift+4):移动到当前行的结尾处 H(大写):使光标移动到屏幕的顶部 M(大写):使光标移动到屏幕的中间 L(大写):使光标移动到屏幕的底部 Ctrl+b:上一屏。...Ctrl+f:下一屏。 Ctrl+d:下半屏。 Ctrl+u: 上半屏。...撤消对一行的更改:输入U来撤消你对一行所做的所有更改,这个命令只有在你没将光标移动到该行以外生效。

    3K80

    【兼容性】H5滚动穿透解决方案

    尽可能响应,滚动一切当前操作可以滚动的元素 只是当把元素设置了 fixed 之后让人感觉是个bug,浏览器没有必要对 fixed 元素做特殊处理,两个不相关的东西,不可能耦合起来 怎么解决滚动穿透 我们理解了滚动穿透的原因之后...之前我们说了,浏览器需要尽可能响应滚动行为,element 滚到两端 element 不了,那我就 document 所以我们最好监听 element 滚到 顶部和 底部的时机,继续禁止滚动行为 var...return e.preventDefault(); } } }; 碰到的问题 1父子元素也存在滚动穿透 这个问题测试了,只在 ios 中存在,滚动穿透的顺序是 子->父->document,而 和...鸿蒙 则不会,子不了,直接document 这个是实际的dom 父子关系才会,视觉上的 父子关系没有这个问题 2子元素 e.stopPropagation() 会让 preventDefault...) 但是document 还是不会滚动的 3滚动穿透的触发条件 一次没有抬起的滚动行为(手没有离开屏幕)导致元素滚动到顶部或者 底部之后,如果手还在屏幕上往两端滑,并不会触发滚动穿透 如果你把元素滚动到

    5.8K20

    小程序上视频列表的渲染与性能优化

    同层渲染下,video 组件的渲染过程(ios和渲染方式不同,此处以为例): 1. WebView 创建一个 embed DOM 节点并指定组件类型。...的同层渲染真正将原生组件视图加到了 WebView 的渲染流程中且 embed 节点是真正的 DOM 节点。当组件的位置发生改变,WebView 更新,不用与客户端通信。...在左右滑动切换更改这3个 video 组件的 transform,达到视觉隐藏和实例复用的目的。...可以看到,切换视频不存在卡顿现象,性能得到了明显的提升。 本方案对 video 组件即用即毁,滑动到可视区域渲染组件,相比 video 组件实例复用,花费的时间会不会多很多呢?...从方案2中的分析可以得到,在 video 组件的 src 赋值前,创建了一个 DOM 节点,该步骤的时间花销较小。在 video 组件的 src 赋值后,“真正”渲染 video 组件。

    3.6K61

    MySQL 核心模块揭秘 | 13 期 | 回滚到 savepoint

    从后往前遍历 m_savepoints 链表的过程中,如果当前遍历的 savepoint 对象名字等于要回的那个 savepoint 对象名字,就找到了,否则,继续往前遍历。...binlog 回,只需要把 write_pos 往回移动,write_pos 新位置和旧位置之间的那些 binlog 日志就被丢弃了。 那么,write_pos 要往回移动到哪个位置呢?...savepoint 中保存着它创建的那一刻的 binlog offset,binlog offset 减去 pos_in_file 就是 write_pos 要往回移动到的位置。...那么,回滚到哪条 undo 日志算完事呢? savepoint 中,保存着它创建之前,最后产生的那条 undo 日志的编号,回滚到这条 undo 日志的下一条 undo 日志就完事了。...SQL 9,rollback to savept2 回滚到编号为 2 的 undo 日志的下一条 undo 日志(编号为 3)就完事了。 SQL 9 需要回编号为 3、4 的两条 undo 日志。

    15410

    MySQL死锁问题定位思路

    :从系统启动到现在等待最长的一次所花的时间; Innodb_row_lock_waits :从系统启动到现在总共等待的次数。...平均时间和锁等待次数比较大的话,说明可能会存在锁争用情况 2. show engine innodb status 展示innodb存储引擎的运行状态 通过这个命令显示的内容比较多,其中有一项lasted...blocking_trx_id:阻塞的事务id,当前拥有锁的事务ID。...在innodb的存储引擎中,当发生死锁需要回,innodb存储引擎会选择该值最小的事务进行回。...trx_query:事务运行的sql语句 写在最后: 出现死锁问题,可以查看系统设置的隔离级别,RR与RC在加锁粒度上存在很大区别,RR隔离级别因为加锁粒度更大,在并发更新表的场景下容易产生思索,通常是因为

    3.5K20

    Chrome加入自定义手势控制

    下面小苏就来说说如何为Chrome添加手势吧~ 解决方案:   以下内容适用于喜欢折腾的Chrome重度用户(步骤重复性高并且比较复杂),手势功能基于应用:GMD手势控制(文末提供下载),并且要求手机获得...注意事项:   这里需要说明:上文中的"操作"这一项适用于全局,因为我们要设定的"返回"手势只需要对Chrome起作用,所以"操作"这一项我们将其设置为"无"。   ...启用"离开屏幕后识别"这一项可以防止GMD手势将我们对屏幕的正常操作"误判"为手势触发条件,如果禁用这一项,GMD手势会检测到用户在屏幕上操作的趋势,当趋势满足某手势触发条件,GMD手势便相应预先设定好的响应动作...同样,GMD手势预置16种"浏览"动作,包括:"后退/前进/刷新/新建标签/新建隐身标签/关闭标签/上一标签/下一标签/打开书签/添加为书签/页面内查找/打开历史记录/滚动至页面顶部/滚动至页面底部/滚动到上一页.../滚动到下一页",基本上是能满足日常浏览要求了~   最后,进入Chrome体验手势操作之旅吧~ 应用下载:   Play商店(Lite版): https://play.google.com

    3.7K30

    大家都能看得懂的源码之 ahooks useVirtualList 封装虚拟滚动列表

    简介 提供虚拟化列表能力的 Hook,用于解决展示海量数据渲染首屏渲染缓慢和滚动卡顿问题。 详情可见官网[3],文章源代码可以点击这里[4]。...根据外部容器的 scrollTop 算出已经“过”多少,值为 offset。 根据外部容器高度以及当前的开始索引,获取到外部容器能承载的个数 visibleCount。...data: ele, index: index + start, })), ); } }; 其它就是这个函数的辅助函数了,包括: 根据外部容器以及内部每一项的高度...,计算出可视区域内的数量: // 根据外部容器以及内部每一项的高度,计算出可视区域内的数量 const getVisibleCount = (containerHeight: number, fromIndex...list[index]), 0); return height; }; 计算总的高度: // 计算总的高度 const totalHeight = useMemo(() => { // 每一项高度相同

    71820

    移动端那些戳中你痛点的软键盘问题及解决方法

    (对于这点,ios本身是支持的,但是却并不会主动让输入框出现在可视区域内) 4、对于部分ios系统下的部分微信webview内,发现软键盘收起,滚动上去的页面没有滚动下来,造成了下面区域留出了一片灰色的区域...为了解决这个问题,ios设计者们让webview上,但滚动的结果有些出乎意料:输入框本身可以理解地滚动到了实际可视区域的正中间,但 fixed 元素不会发生重新计算,而是保持原来的相对位置,跟着输入框一起被上推...衍生问题解决办法 之前header头用的是前端自己写的header,没有这个问题,推测是因为手机在键盘弹起的webview高度缩短为整个屏幕的高度减去键盘的高度, 在之前的实现中,由于使用沉浸式...(对于这点,ios本身是支持的,但是却并不会主动让输入框出现在可视区域内) 这个简单,让元素滚动到可视区内,直接用scrollIntoView(true)方法就好。... ?

    8.3K30

    android gallery当前view变大,GitHub – hutcwpGalleryViewDemo: 实现画廊效果(中间放大两边缩小)无限循环向左滑向右滑,Viewpager和Recycl

    smoothScrollToPosition(position)和scrollToPosition(position)效果基本相似,也是把你想显示的显示出来,只要那一项现在看得到了,那它就罢工了, 不同的是...smoothScrollToPosition是平滑到你想显示的,而scrollToPosition是直接定位显示。...的首尾多添加一个 View,监听 ViewPager 滚动事件,当滑到边界,设置当前 position 为中间的某个 item,不过这种方式容易出现页面闪动导致滑动不连贯,这是因为 ViewPager...} @Override public void onPageSelected(int position) { if (position < 1) { //如果item位置小于1,也就是滑动到第...else if (position > mPagerAdapter.getCount() – 2) { //同理如果item位置大于倒数第二个view的位置,也就是滑动到最后一个item的位置

    2.3K20

    Linux Vi 文本编辑器常用命令

    2、插入模式 (Insert mode): 只有在插入模式下可以进行文字输入,按[ESC]键可以退回到命令模式。...4、三种模式之间的切换: 注意:三种模式之间不是任意切换的,只有在命令模式下可以进入插入模式和末行模式。...按[a]键进入插入模式后,是当前光标所在位置之后开始输入文字; 按[i]键进入插入模式后, 是当前光标所在位置之前开始输入文件; 按[o]键进入插入模式后,是在光标所在位置下一行添加新的一行,从行首开始输入文字...gg 光标移动到文件第一行 7、控制命令 打开一个内容很多的文件的时候经常用到。...Ctrl+d 向下半屏 Ctrl+u 向上半屏 Ctrl+f 向下全屏 Ctrl+b 向上全屏 8、编辑命令 主要是进入编辑状态,也就是insert状态 i 光标当前位置开始编辑 o

    3.6K30

    【说站】mysql事务的分类介绍

    保存点用于通知系统记住事务的当前状态,以便事务能够回到保存点的当时状态。 对扁平事务而言,它在事务开始隐式设置了一个保存点,扁平事务只有这个保存点,因此,回只能回到事务开始的状态。...链接事务是指一项事务在提交自动将上下文传递给下一项事务,即一项事务的提交和下一项事务的开始是原子性的,下一项事务可以看到上一项事务的结果,就像在一项事务中进行一样。...链式事务可以看作是保存点模式的一个变种,不同的是,带保存点的扁平事务可以回到任何正确的保存点,而链式事务的回仅限于当前事务。...子事务提交后,不会真正提交,而是等到父事务提交后真正提交,父事务回来后,所有子事务都会回来。 MySQL不支持嵌套事务,但我们可以通过有保存点的事务模拟串行嵌套事务。 5、分布式事务。

    36420

    仿淘宝、京东拖拽商品详情(可嵌套ViewPager、ListView、WebView、FragmentTabhost)实现效果图实现

    其余的就是处理滚动及动画的问题,首先自定义ViewGroup内部先声明两个顶层子ViewmUpstairsView、 View mDownstairsView,并且采用一个变量CurrentTargetIndex标记当前处于操作那个...DOWNSTAIRS : UPSTAIRS; } } 然后集中处理滚动事件,对于滚动与动画主要有如下几个问题需要解决: 如何知道上面或者下面的View已经滚动的到顶部或者底部 滚动到边界...(View view, int offSet, MotionEvent ev)就可以判断当前View是否可以向哪个方向滚动,offset的正负值用来判断向上还是向下,当然,仅仅靠这个函数还是不够的,因为...不过,并非所有的子View都需要遍历,只有与TouchEvent相关的View需要判断。...mUpstairsView.getMeasuredHeight())); } mVelocityTracker.addMovement(event); } 收尾动画 在Up事件之后,还要简单的处理一下一下收尾的滚动动画

    1.2K30
    领券