博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
scrollerview中使用viewpager嵌套fragmentment 滚动事件冲突解决
阅读量:4456 次
发布时间:2019-06-08

本文共 2896 字,大约阅读时间需要 9 分钟。

1、重写viewpager 对事件分发进行拦截,主要拦截横向滑动

 

/**

* 嵌套在scrollerview中时计算固定高度
* Created by shenshilei on 2017/5/10.
*/
public class ScViewPager extends ViewPager {
private float xDistance, yDistance, xLast, yLast;
public ScViewPager(Context context) {
super(context);
}

public ScViewPager(Context context, AttributeSet attrs) {

super(context, attrs);
}

/**

* 事件分发,判断是否是左右滑动并且右侧有没有子项
* @param ev
* @return
*/
@Override
public boolean 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;

Log.e("Client",xDistance+"移动"+yDistance);

if (xDistance > yDistance &&(getCurrentItem()>0||getCurrentItem()<getChildCount()-1)) {

Log.e("Client","右侧还有");
return true;
}else if(yDistance>xDistance){
getParent().requestDisallowInterceptTouchEvent(false);
}
// else if (xDistance > yDistance &&(getCurrentItem()==getChildCount()-1)){
// Log.e("Client","右侧没有");
// return false;
// }else{
// getParent().requestDisallowInterceptTouchEvent(false);
// Log.e("Client","其他");
// return true;
// }

}

return super.onInterceptTouchEvent(ev);

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int viewHeight = 0;
View childView = getChildAt(getCurrentItem());
if(childView != null){
childView.measure(widthMeasureSpec,
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
viewHeight = childView.getMeasuredHeight();
heightMeasureSpec = MeasureSpec.makeMeasureSpec(viewHeight,
MeasureSpec.EXACTLY );
}

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

}

2、第二步重写scrollerview 主要是对纵向滑动事件进行拦截

/**
* 解决嵌套viewpager时事件冲突的问题
* Created by shenshilei on 2017/5/10.
*/
public class VpScrollView extends ScrollView {
private float xDistance, yDistance, xLast, yLast;

public VpScrollView(Context context) {

super(context);
}

public VpScrollView(Context context, AttributeSet attrs) {

super(context, attrs);
}

public VpScrollView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);
}

@Override

public boolean 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;
Log.e("Client", "scollerview :"+xDistance + "移动" + yDistance);
if (xDistance > yDistance) {
return false;
}
}

return super.onInterceptTouchEvent(ev);

}

@Override

protected int computeScrollDeltaToGetChildRectOnScreen(Rect rect) {
return 0;
}
}

转载于:https://www.cnblogs.com/shenshilei/p/6839425.html

你可能感兴趣的文章
【转】在EmEditor上编译并运行JAVA
查看>>
关于SqlDateTime溢出的问题
查看>>
jquery下php与ajax的数据交换方式
查看>>
魅蓝Note有几种颜色 魅蓝Note哪个颜色好看
查看>>
使用PullToRefresh实现下拉刷新和上拉加载
查看>>
透明度百分比与十六进制转换
查看>>
HBase表预分区
查看>>
arcgis desktop 10.1 license manager无法启动问题解决
查看>>
django select_related() 联表查询
查看>>
mysql 常用,使用经验
查看>>
NSBundle,UIImage,UIButton的使用
查看>>
vue-cli3 中console.log报错
查看>>
GridView 中Item项居中显示
查看>>
UML类图五种关系与代码的对应关系
查看>>
如何理解作用域
查看>>
从无到满意offer,你需要知道的那些事
查看>>
P1516 青蛙的约会 洛谷
查看>>
SDOI2011 染色
查看>>
JQuery EasyUI combobox动态添加option
查看>>
面向连接的TCP概述
查看>>