问题描述
我已经实现了Viewpager2的左右预览,如下图所示。但是滚动仅适用于中间项目(2)。不在左(1)和右(3)项目预览上。 如何在左右预览上进行滚动操作。
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_marginTop="@dimen/_5sdp"
android:paddingStart="@dimen/_50sdp"
android:paddingEnd="@dimen/_50sdp"
/>
Java代码
viewpager.setoffscreenPageLimit(3);
viewpager.setClipToPadding(false);
viewpager.setClipChildren(false);
CompositePageTransformer cpt = new CompositePageTransformer();
cpt.addTransformer(new MarginPageTransformer(10));
cpt.addTransformer(new ViewPager2.PageTransformer() {
@Override
public void transformPage(@NonNull View page,float position) {
float r = 1 - Math.abs(position);
page.setScaleY(0.80f + r * 0.20f);
}
});
viewpager.setPageTransformer(cpt);
viewpager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageScrolled(int position,float positionOffset,int positionOffsetPixels) {
super.onPageScrolled(position,positionOffset,positionOffsetPixels);
if (position == 0) {
viewpager.setCurrentItem((int) (A1.list.size() / 2));
}
}
});
解决方法
老实说,由于Viewpager2类是最终的,所以我没有找到使Viewpager2能够处理左右预览上的滑动事件的真正方法。但是使用NestedScrollview效果很好。
<androidx.core.widget.NestedScrollView
android:id="@+id/nestedScroll"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="@dimen/_5sdp"
android:paddingStart="@dimen/_50sdp"
android:paddingEnd="@dimen/_50sdp"
/>
</androidx.core.widget.NestedScrollView>
在我使用Scrollview之前,ACTION_CANCEL仍然存在一些问题。切换到Nested_Scrollview后,效果很好。
nestedScroll = view.findViewById(R.id.nestedScroll);
nestedScroll.setOnTouchListener(new View.OnTouchListener() {
float start=0;
@Override
public boolean onTouch(View view,MotionEvent motionEvent) {
Log.d("TAG","onTouch: "+ motionEvent.getAction());
if(motionEvent.getAction() == MotionEvent.ACTION_MOVE) {
Log.d("TAG","onTouch: ACTION_MOVE" + viewpager.getCurrentItem());
viewpager.beginFakeDrag();
if( start > motionEvent.getX()) {
viewpager.fakeDragBy((-1*motionEvent.getXPrecision()));
}else {
viewpager.fakeDragBy((motionEvent.getXPrecision()));
}
// Log.d("TAG","onTouch: start"+start+" " + motionEvent.getX());
start =motionEvent.getX();
}
if(motionEvent.getAction() == MotionEvent.ACTION_UP) {
// viewpager.
if(viewpager.isFakeDragging()){
viewpager.endFakeDrag();
}
}
if(motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
// viewpager.
// Log.d("TAG","onTouch: ACTION_DOWN" + motionEvent.getXPrecision());
start=motionEvent.getX();
}
/* if(motionEvent.getAction() == MotionEvent.ACTION_CANCEL) {
// viewpager.
if(viewpager.isFakeDragging()){
viewpager.endFakeDrag();
if( start > motionEvent.getX()) {
viewpager.setCurrentItem( viewpager.getCurrentItem()+1);
}else {
viewpager.setCurrentItem( viewpager.getCurrentItem()-1);
}
}
}*/
return false;
}
});