基本都是参考别人的东西,没做大的改动,只是整合了一下一些类似的东西,如下
现在查找ScrollView中带有Viewpager滑动冲突的,很多都copy的下面这个,我也用了一段时间,发现这个有一点小问题,就是有些时候上下滑动会卡住,后来又去找了一些,发现了一个新的,目前用的就是下面的那个,虽然还是有点不尽如人意,但是也可以满足大部分需求了,至于如何使用(新手看一下了),在你要引用它的xml文件里,使用com.xx.xx.ScrowViewWithViewpager来代替原本的scrollview就可以了,
另外还有listview中横向滑动则有另外的方法,也写在下面了
这个偶尔会卡住
public class ScrollViewWithViewpagerextends ScrollView{
/**
* 解决ScrollView嵌套ViewPager出现的滑动冲突问题
*/
publicstatic booleancanScroll;
private GestureDetectormGestureDetector;
View.OnTouchListener mGestureListener;
floatxDistance,yDistance,xLast,yLast;
publicScrollViewWithViewpager(Context context, AttributeSet attrs) {
super(context, attrs);
mGestureDetector =new GestureDetector(new YScrollDetector());
canScroll =true;
}
@Override
publicboolean onInterceptTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_UP){
canScroll =true;
}
returnsuper.onInterceptTouchEvent(event) && mGestureDetector.onTouchEvent(event);
}
class YScrollDetectorextends SimpleOnGestureListener {
@Override
publicboolean onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY) {
if(canScroll)
if (Math.abs(distanceY) < Math.abs(distanceX)){
canScroll = false;
}else{
canScroll = true;
}
returncanScroll;
}
}
}
下面这种方法,是不会卡住了
float xDistance,yDistance,xLast,yLast;
public ScrollViewWithViewpager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
publicboolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
xDistance = yDistance = 0f;
xLast = ev.getX();
yLast = ev.getY();
break;
case MotionEvent.ACTION_MOVE:
final float curX = ev.getX();
final float curY = ev.getY();
xDistance += Math.abs(curX - xLast);
yDistance += Math.abs(curY - yLast);
xLast = curX;
yLast = curY;
if(xDistance > yDistance){
return false;
}
}
returnsuper.onInterceptTouchEvent(ev);
}
listview中布局的横向滑动
listview.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
canScroll =false;
}
returncanScroll;
}
});
adapter中的view
view.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction()==MotionEvent.ACTION_CANCEL) {
canScroll =false;
}else{
canScroll =true;
}
return true;
}
}