Android中Viewpager禁⽌滑动的实现前⾔
现在很多app,⾸页不允许滑动切换(因为页⾯加载吧),但是⼜⽤viewpage来管理frgament.因为⽅便嘛.
以前在⽹上的例⼦:
public class NoScrollViewPager extends ViewPager {
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);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
InterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return true;
}
这个⾃定义如果继承的Viewpager是低版本的,那么是没问题的.
但是如果你编译时⽤是⾼版本的api,5.0以后吧.上⾯这个⾃定义就会失效,
你会发现,会有细微的滑动.还是能滑动的
判断⽼的还是新的,看setOnPageChangeListener就知道了
最新的Viewpager⾥⾯这个⽅法已经废弃了,改成addOnPageChangeListener()了.
由于之前改viewpager做懒加载.⼀直保留了⼀个⽼版本的Viewpager使⽤.直到最近才发现.
改进后
public class NoScrollViewPager extends ViewPager {
private boolean isScroll;
public NoScrollViewPager(Context context,AttributeSetattrs{
super(context, attrs);
}
public NoScrollViewPager(Context context) {
super(context);
}
/**
* 1.dispatchTouchEvent⼀般情况不做处理
*,如果修改了默认的返回值,⼦孩⼦都⽆法收到事件
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev); // return true;不⾏
}
/**
android最新版* 是否拦截
* 拦截:会⾛到⾃⼰的onTouchEvent⽅法⾥⾯来
* 不拦截:事件传递给⼦孩⼦
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// return false;//可⾏,不拦截事件,
// return true;//不⾏,孩⼦⽆法处理事件
/
/InterceptTouchEvent(ev);//不⾏,会有细微移动
if (isScroll){
InterceptTouchEvent(ev);
}else{
return false;
}
}
/**
* 是否消费事件
* 消费:事件就结束
* 不消费:往⽗控件传
*/
@Override
public boolean onTouchEvent(MotionEvent ev) {
//return false;// 可⾏,不消费,传给⽗控件
//return true;// 可⾏,消费,拦截事件
//TouchEvent(ev); //不⾏,
//虽然onInterceptTouchEvent中拦截了,
//但是如果viewpage⾥⾯⼦控件不是viewgroup,还是会调⽤这个⽅法.
if (isScroll){
TouchEvent(ev);
}else {
return true;// 可⾏,消费,拦截事件
}
}
public void setScroll(boolean scroll) {
isScroll = scroll;
}
}
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作能带来⼀定的帮助,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论