【发布时间】:2019-09-17 16:02:06
【问题描述】:
我想在 Fragment 内的 HorizontalScrollView 中实现 Snapping 效果,即当用户水平滚动第一个项目(项目可见> 50%)时,HorizontalScrollView 需要完全移动到下一个项目。我想要的是当用户水平滚动第一个项目超过 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 文件中,我有 HorizontalScrollView,其中有一个父 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