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