Android 自定义不可滑动ViewPager

最近在做一个广告轮播的项目,需求是不同的图片可以轮流播放,并且用户不可点击滑动,于是就做了个不可滑动的ViewPager。下面进入正题。

1、新建控件类,并且继承ViewPager

public class NoScrollViewPager extends ViewPager {

    public NoScrollViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public NoScrollViewPager(Context context) {
        super(context);
    }
}

2、重写dispatchTouchEvent(MotionEvent ev)onInterceptTouchEvent(MotionEvent ev)onTouchEvent(MotionEvent ev)三个方法。
方法说明:
dispatchTouchEvent(MotionEvent ev):这个方法发送触摸事件的时候会被调用,一般情况不做处理,如果修改了默认的返回值,子孩子都无法收到事件;
onInterceptTouchEvent(MotionEvent ev):这个方法拦截触摸的时候会被调用,拦截:会走到自己的onTouchEvent方法里面来,不拦截:事件传递给子控件
onInterceptTouchEvent(MotionEvent ev):这个方法在触摸的时候会被调用,拦截:事件就结束,不拦截:往父控件传。接下来上码

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        return super.dispatchTouchEvent(ev);   // return true;不行
    }
  
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
  
        if (isScroll){
            return super.onInterceptTouchEvent(ev);
        }else{
            return false;
        }
    }
  
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
    
        //虽然onInterceptTouchEvent中拦截了,
        //但是如果viewpage里面子控件不是viewgroup,还是会调用这个方法.
        if (isScroll){
            return super.onTouchEvent(ev);
        }else {
            return true;// 可行,消费,拦截事件
        }
    }

3、暴露一个方法用于设置是否可以滑动就行了

 public void setScroll(boolean scroll) {
        isScroll = scroll;
    }

完整代码如下

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import androidx.viewpager.widget.ViewPager;

public class NoScrollViewPager extends ViewPager {
    private boolean isScroll;
    public NoScrollViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public NoScrollViewPager(Context context) {
        super(context);
    }
  
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        return super.dispatchTouchEvent(ev);   // return true;不行
    }
   
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
       
        if (isScroll){
            return super.onInterceptTouchEvent(ev);
        }else{
            return false;
        }
    }
 
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
      
        //虽然onInterceptTouchEvent中拦截了,
        //但是如果viewpage里面子控件不是viewgroup,还是会调用这个方法.
        if (isScroll){
            return super.onTouchEvent(ev);
        }else {
            return true;// 可行,消费,拦截事件
        }
    }
    public void setScroll(boolean scroll) {
        isScroll = scroll;
    }
}

使用:使用很简单,只需要在xml布局文件中注册控件,并且在代码中设置状态即可
xml布局文件:




    


Java代码:

        NoScrollViewPager  noScrollViewPager = findViewById(R.id.noScrollViewPager);
        noScrollViewPager.setAdapter(myFragmentPagerAdapter);

你可能感兴趣的:(Android 自定义不可滑动ViewPager)