美文网首页
Android 自定义不可滑动ViewPager

Android 自定义不可滑动ViewPager

作者: 泪X累 | 来源:发表于2019-10-03 16:56 被阅读0次

最近在做一个广告轮播的项目,需求是不同的图片可以轮流播放,并且用户不可点击滑动,于是就做了个不可滑动的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布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipChildren="false">

    <megvii.testfacepass.view.NoScrollViewPager
        android:id="@+id/noScrollViewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

Java代码:

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

相关文章

网友评论

      本文标题:Android 自定义不可滑动ViewPager

      本文链接:https://www.haomeiwen.com/subject/gyrfuctx.html