【问题标题】:Snapping in HorizontalScrollView inside Fragment在 Fragment 内的 Horizo​​ntalScrollView 中捕捉
【发布时间】:2019-09-17 16:02:06
【问题描述】:

我想在 Fragment 内的 Horizo​​ntalScrollView 中实现 Snapping 效果,即当用户水平滚动第一个项目(项目可见> 50%)时,Horizo​​ntalScrollView 需要完全移动到下一个项目。我想要的是当用户水平滚动第一个项目超过 50% 时,我只想显示第二个子视图。这样,如果用户水平滚动第二个项目,我只想显示第三个子视图。

下面我用过smoothScrollTo()。

        DisplayMetrics displayMetrics = new DisplayMetrics();
        ((Activity)getContext()).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        height = displayMetrics.heightPixels;
        width = displayMetrics.widthPixels;
        homeBinding.sevenDaysCaseHistoryScroll.setMinimumWidth(width);
        homeBinding.sevenDaysEczemaVsWeatherScroll.setMinimumWidth(width);
        homeBinding.sevenDaysEczemaVsCareRoutineScroll.setMinimumWidth(width);
        homeBinding.sevenDaysEczemaVsTriggersScroll.setMinimumWidth(width);

        homeBinding.sevenDaysHorizontalView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                if(homeBinding.sevenDaysHorizontalView.getScrollX() < (width/2)){
                    sevenDaysShowCaseHistoryDot();
                    homeBinding.sevenDaysHorizontalView.smoothScrollTo(0,0);
                } else if(homeBinding.sevenDaysHorizontalView.getScrollX() > (width/2) && homeBinding.sevenDaysHorizontalView.getScrollX() < (2*width)-(width/2)){
                    sevenDaysShowEczemaVsWeatherDot();
                    homeBinding.sevenDaysHorizontalView.smoothScrollTo(width,0);
                } else if(homeBinding.sevenDaysHorizontalView.getScrollX() > (2*width)-(width/2) && homeBinding.sevenDaysHorizontalView.getScrollX() < (3*width)-(width/2)){
                    sevenDaysShowEczemaVsCareRoutineDot();
                    homeBinding.sevenDaysHorizontalView.smoothScrollTo(2*width,0);
                } else if(homeBinding.sevenDaysHorizontalView.getScrollX() > (3*width)-(width/2)){
                    sevenDaysShowEczemaVsTriggersDot();
                    homeBinding.sevenDaysHorizontalView.smoothScrollTo(3*width,0);
                }
                return false;
            }
        });

当前行为是当用户水平滚动第一个项目(项目可见> 50%)时,用户可以看到第一个子视图和第二个子视图,就像网格视图一样。但我只想要单个子视图。

在 XML 文件中,我有 Horizo​​ntalScrollView,其中有一个父 LinearLayout 和 4 个子线性布局。示例布局如下。

<HorizontalScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/sevenDaysHorizontalView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fillViewport="true">
    <LinearLayout
        android:id="@+id/sevenDaysGraphLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:orientation="horizontal">

        <LinearLayout
            android:id="@+id/sevenDaysCaseHistoryScroll"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="10dp"
            android:orientation="vertical">


        </LinearLayout>

        <LinearLayout
            android:id="@+id/sevenDaysEczemaVsWeatherScroll"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="10dp"
            android:orientation="vertical">



        </LinearLayout>

        <LinearLayout
            android:id="@+id/sevenDaysEczemaVsCareRoutineScroll"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:orientation="vertical">

        </LinearLayout>

        <LinearLayout
            android:id="@+id/sevenDaysEczemaVsTriggersScroll"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="10dp"
            android:orientation="vertical">

        </LinearLayout>
    </LinearLayout>
</HorizontalScrollView>

可以做些什么来解决这个问题?

【问题讨论】:

  • 使用 ViewPager 将负责捕捉。您可以通过实现自定义 ViewPager.OnPageChangeListener 添加自己的过渡。
  • @darms 感谢您的建议。如果可以使用水平滚动视图提供任何解决方案,那就太好了。

标签: android android-fragments horizontalscrollview


【解决方案1】:

终于解决了我的问题。

homeBinding.sevenDaysHorizontalView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch ( event.getAction( ) ) {
                    case MotionEvent.ACTION_SCROLL:
                    case MotionEvent.ACTION_MOVE:
                        break;
                    case MotionEvent.ACTION_DOWN:

                        break;
                    case MotionEvent.ACTION_CANCEL:
                    case MotionEvent.ACTION_UP:
                        if(homeBinding.sevenDaysHorizontalView.getScrollX() < (width/2)){
                            sevenDaysShowCaseHistoryDot();
                            homeBinding.sevenDaysHorizontalView.scrollTo(0,0);
                        } else if(homeBinding.sevenDaysHorizontalView.getScrollX() > (width/2) && homeBinding.sevenDaysHorizontalView.getScrollX() < (2*width)-(width/2)){
                            sevenDaysShowEczemaVsWeatherDot();
                            homeBinding.sevenDaysHorizontalView.scrollTo(width,0);
                        } else if(homeBinding.sevenDaysHorizontalView.getScrollX() > (2*width)-(width/2) && homeBinding.sevenDaysHorizontalView.getScrollX() < (3*width)-(width/2)){
                            sevenDaysShowEczemaVsCareRoutineDot();
                            homeBinding.sevenDaysHorizontalView.scrollTo(2*width,0);
                        } else if(homeBinding.sevenDaysHorizontalView.getScrollX() > (3*width)-(width/2)){
                            sevenDaysShowEczemaVsTriggersDot();
                            homeBinding.sevenDaysHorizontalView.scrollTo(3*width,0);
                        }
                        break;
                }
                return false;
            }
        })

;

【讨论】:

    猜你喜欢
    • 2012-03-17
    • 2018-03-31
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多