Emi*_*Adz 29 android swipe android-viewpager
我想允许用户ViewPager仅从右向左滑动.因此,一旦他通过一个页面,他就无法回到它.如何才能做到这一点?
我试过这个解决方案:
public class CustomViewPager extends ViewPager {
float lastX = 0;
boolean lockScroll = false;
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomViewPager(Context context) {
super(context);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = ev.getX();
lockScroll = false;
return super.onTouchEvent(ev);
case MotionEvent.ACTION_MOVE:
if (lastX > ev.getX()) {
lockScroll = false;
} else {
lockScroll = true;
}
lastX = ev.getX();
break;
}
lastX = ev.getX();
if(lockScroll) {
return false;
} else {
return super.onTouchEvent(ev);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但它仍然允许我向另一个方向轻扫.
and*_*9mv 71
还有一个你想念的事件:onInterceptTouchEvent.它必须包含与onTouchEvent相同的逻辑.
我的完整解决方案基于这个 答案.它允许您在任何需要的时间内在任何方向启用/禁用分页.
1.创建枚举
public enum SwipeDirection {
all, left, right, none ;
}
Run Code Online (Sandbox Code Playgroud)
2.扩展ViewPager
public class CustomViewPager extends ViewPager {
private float initialXValue;
private SwipeDirection direction;
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
this.direction = SwipeDirection.all;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (this.IsSwipeAllowed(event)) {
return super.onTouchEvent(event);
}
return false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (this.IsSwipeAllowed(event)) {
return super.onInterceptTouchEvent(event);
}
return false;
}
private boolean IsSwipeAllowed(MotionEvent event) {
if(this.direction == SwipeDirection.all) return true;
if(direction == SwipeDirection.none )//disable any swipe
return false;
if(event.getAction()==MotionEvent.ACTION_DOWN) {
initialXValue = event.getX();
return true;
}
if(event.getAction()==MotionEvent.ACTION_MOVE) {
try {
float diffX = event.getX() - initialXValue;
if (diffX > 0 && direction == SwipeDirection.right ) {
// swipe from left to right detected
return false;
}else if (diffX < 0 && direction == SwipeDirection.left ) {
// swipe from right to left detected
return false;
}
} catch (Exception exception) {
exception.printStackTrace();
}
}
return true;
}
public void setAllowedSwipeDirection(SwipeDirection direction) {
this.direction = direction;
}
Run Code Online (Sandbox Code Playgroud)
3.在布局中使用viewPager
<package_name.customviewpager
android:id="@+id/customViewPager"
android:layout_height="match_parent"
android:layout_width="match_parent" />
Run Code Online (Sandbox Code Playgroud)
4.在代码中启用任何滑动方向.默认为全部(左右)
mViewPager.setAllowedSwipeDirection(SwipeDirection.right);
Run Code Online (Sandbox Code Playgroud)
像这样定义你的适配器
public class MyFragmentStatePagerAdapter extends FragmentStatePagerAdapter {
private final int totalPages = 10;
private int currentPage = 0;
public MyFragmentStatePagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
// Use whatever logic you want here to
// to select a fragment based on
// currentPage instead of position
if (currentPage % 2 == 0) {
return new Fragment1();
} else {
return new Fragment2();
}
}
@Override
public int getCount() {
return currentPage == totalPages ? 1 : 2;
}
@Override
public int getItemPosition(Object object){
return PagerAdapter.POSITION_NONE;
}
public void nextPage() {
currentPage++;
notifyDataSetChanged();
}
}
Run Code Online (Sandbox Code Playgroud)
在使用视图分页器的片段中,执行以下操作
@Override
public void onPageSelected(int arg0) {
if (arg0 > 0) {
pagerAdapter.nextPage();
pager.setCurrentItem(0, false);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20556 次 |
| 最近记录: |