项目中用到了viewpager的嵌套,多种解决办法,适用于自定义View,滑动控件的冲突。
1.第一种处理方法
继承ViewPager重写canScroll方法,在canScroll方法中过滤与ViewPager冲突的View。
public class ViewPager1 extends ViewPager {
@Override
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
if (v.getClass().getName().equals("com.zzcy.*****.utils.ColorPickerView")) {
return true;
}
if (v.getClass().getName().equals("com.zzcy*****.view.ArcSeekBar")) {
return true;
}
return super.canScroll(v, checkV, dx, x, y);
}
/**
* 解决内部多个滑动控件同时滑动 崩溃的问题 建议加上
* @param ev
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent ev) {
try {
return super.onTouchEvent(ev);
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
}
return false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
try {
return super.onInterceptTouchEvent(ev);
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
}
return false;
}
/* private int preX = 0;
@Override
public boolean onInterceptTouchEvent(MotionEvent even) {
if (even.getAction() == MotionEvent.ACTION_DOWN) {
preX = (int) even.getX();
} else {
if (Math.abs((int) even.getX() - preX) > 10) {
return true;
} else {
preX = (int) even.getX();
}
}
return super.onInterceptTouchEvent(even);
}*/
}
2.第二种处理方法
这个简单,在子控件的滑动的开始于结束的时候对viewpager进行控制 以ViewPager嵌套SeekBar为例 与 onTouch()滑动相似。
//滑动的开始与结束 进行判断 以ViewPager嵌套SeekBar为例
/**
* 滑块监听
*
* @param seekBar
* @param progress 具体值
* @param fromUser
*/
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
switch (seekBar.getId()) {
case R.id.kbs_red://红色
//滑动中的操作
break;
}
}
/**
* 滑块开始
*
* @param seekBar
*/
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
switch (seekBar.getId()) {
case R.id.kbs_red:
kbsRed.getParent().requestDisallowInterceptTouchEvent(true);//告诉ViewPager子控件滑动
break;
}
}
/**
* 滑块结束 发送指令
*
* @param seekBar
*/
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
switch (seekBar.getId()) {
case R.id.kbs_red://红色
kbsRed.getParent().requestDisallowInterceptTouchEvent(false);//
break;
}
}