当前位置: 首页 > 知识库问答 >
问题:

浏览页面,仅限制水平滚动?

杜成和
2023-03-14

我已经在我的应用程序中实现了SwipeRefreshLayout和ViewPager,但有一个大问题:每当我要向左/向右滑动以在页面之间切换时,滚动太敏感了。向下轻扫将触发SwipeRefreshLayout刷新。

我想设置水平滑动开始的时间限制,然后仅强制水平滑动,直到滑动结束。换句话说,当手指水平移动时,我想取消垂直切换。

此问题仅发生在查看页面上,如果我向下滑动并触发刷新功能(显示条),然后水平移动手指,它仍然只允许垂直滑动。

我试图扩展ViewPager类,但它根本不起作用:

public class CustomViewPager extends ViewPager {

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

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        boolean in = super.onInterceptTouchEvent(ev);
        if (in) {
            getParent().requestDisallowInterceptTouchEvent(true);
            this.requestDisallowInterceptTouchEvent(true);
        }
        return false;
    }

}

布局xml:

<android.support.v4.widget.SwipeRefreshLayout
    android:id="@+id/viewTopic"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.myapp.listloader.foundation.CustomViewPager
        android:id="@+id/topicViewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</android.support.v4.widget.SwipeRefreshLayout>

任何帮助都将不胜感激,谢谢

共有3个答案

宋奇希
2023-03-14

我遇到了你的问题。定制SwipeRefreshLayout可以解决这个问题。

public class CustomSwipeToRefresh extends SwipeRefreshLayout {

private int mTouchSlop;
private float mPrevX;

public CustomSwipeToRefresh(Context context, AttributeSet attrs) {
    super(context, attrs);

    mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            mPrevX = MotionEvent.obtain(event).getX();
            break;

        case MotionEvent.ACTION_MOVE:
            final float eventX = event.getX();
            float xDiff = Math.abs(eventX - mPrevX);

            if (xDiff > mTouchSlop) {
                return false;
            }
    }

    return super.onInterceptTouchEvent(event);
}

请参见参考:链接

闾丘鸣
2023-03-14

很简单的解决了不用延伸什么

mPager.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        mLayout.setEnabled(false);
        switch (event.getAction()) {
            case MotionEvent.ACTION_UP:
                mLayout.setEnabled(true);
                break;
        }
        return false;
    }
});

工作就像一个魅力

胡景焕
2023-03-14

我不确定您是否仍然存在此问题,但Google I/O app iosched解决了此问题:

    viewPager.addOnPageChangeListener( new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled( int position, float v, int i1 ) {
        }

        @Override
        public void onPageSelected( int position ) {
        }

        @Override
        public void onPageScrollStateChanged( int state ) {
            enableDisableSwipeRefresh( state == ViewPager.SCROLL_STATE_IDLE );
        }
    } );


private void enableDisableSwipeRefresh(boolean enable) {
    if (swipeContainer != null) {
            swipeContainer.setEnabled(enable);
    }
}

我用过同样的,工作得很好。

编辑:使用addOnPageChangeListener()而不是setOnPageChangeListener()。

 类似资料:
  • 页面浏览分为两部分: 时间/页面筛选 和 页面浏览详情 1.时间/页面筛选 1)便捷按钮有今日、昨日、前日、上周 X、近七天 2)能自定义选择时间段,同时能搜索出个别字眼的页面来得出想要的结果报表 2.页面浏览详情 1)页面浏览,是指被浏览的网页,点击表头可以按相应的项目排序 2)如有需要,亦可点击下载当前报表及更多数据下载,将报表下载到个人电脑,以供存档及分析 3)点击 [细] 可查看访

  • 问题内容: 我正在尝试创建一系列只能水平滚动的照片。 它应该看起来像这样的 但是,只有通过指定包含照片的的宽度,才能实现上述目的(因此它们不会“自动换行”)。如果我不放宽- 看起来像这样; 使用CSS可以防止固定宽度的图像发生变化,该怎么办。 谢谢 问题答案: 您可以使用与。这样写:

  • 我有一个水平ScrollView,它有两个元素:CardView和水平RecycerView。所以,当用户水平滚动时,我希望这两个元素滚动。 我想有这样的东西:Goal,橙色的线是CardView,黄色的线是RecycerView。当用户滚动时,两个元素滚动,如下所示:Scrolled Goal。 现在在我的应用程序中,当用户滚动时,只有RecycerView滚动。CardView保持在他的位置。

  • 问题内容: 我有一个div容器,其定义如下: 填充此div包含的表格后,这将自动为我提供水平和垂直滚动条。我只希望只自动显示水平滚动条。我将以编程方式修改桌子的高度。 我该怎么做呢? 问题答案: 除非使内容足够大以至于不能使用它们,否则不应同时获得水平和垂直滚动条。 但是,由于错误,您通常在IE中进行操作。签入其他浏览器(Firefox等)以查明是否实际上只有IE在执行此操作。 IE6-7(在其他

  • 请看http://codepen.io/anon/pen/zGLZoR 我的“浮动div”跟随页面滚动-它在向下移动滚动条后立即执行此操作。如何仅在达到px(比如200px)滚动高度时启动浮动。因此,当您向下滚动200px时,可以看到浮动div,而不是直接看到。 编辑: 当滚动回到顶部时,div必须返回到原始位置-超过200px标记

  • 我正在咨询你,因为我正在处理一些关于VSCODE的困扰我的事情。 我们目前正在创建一个应用程序,它应该在本地运行,所以我们的代码中确实有很多base64行。可以想象,这些字符串相当大: 这对我(和我的同事)来说是个问题,因为我们对这种轻量级的“Visual Studio”式编辑器很感兴趣,但又无法避免出现断行,这使得导航某些脚本非常复杂。