Xamarin.Forms中ScrollViews嵌套ScrollView 都是横向的,里面的ScrollView不响应

XXP_KING_VB 2016-06-21 03:27:48
RT,各位大牛,我最近在学习xamarin.forms,遇到一个问题,大致就是标题上说的,两个ScrollView嵌套,结果里面的ScrollView不响应,只有外面的ScrollView响应了我移动这个手势操作。这个要怎么解决。
如图,外面的是B,里面的是A

献上仅有的28分,等待大神解答
...全文
2724 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_17134583 2016-07-26
  • 打赏
  • 举报
回复
你标签在下是怎么实现的?求解答,谢谢
荖司机 2016-06-21
  • 打赏
  • 举报
回复
如果帮到你了,记得给分。
荖司机 2016-06-21
  • 打赏
  • 举报
回复
众所周知,android 里两个相同方向的ScrollView是不能嵌套的。

你需要再写个ScrollView。




package com.sun.shine.study.innerscrollview.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ScrollView;

public class InnerScrollView extends ScrollView {


public ScrollView parentScrollView;

public InnerScrollView(Context context, AttributeSet attrs) {
super(context, attrs);

}

private int lastScrollDelta = 0;

public void resume() {
overScrollBy(0, -lastScrollDelta, 0, getScrollY(), 0, getScrollRange(), 0, 0, true);
lastScrollDelta = 0;
}

int mTop = 10;


public void scrollTo(View targetView) {

int oldScrollY = getScrollY();
int top = targetView.getTop() - mTop;
int delatY = top - oldScrollY;
lastScrollDelta = delatY;
overScrollBy(0, delatY, 0, getScrollY(), 0, getScrollRange(), 0, 0, true);
}

private int getScrollRange() {
int scrollRange = 0;
if (getChildCount() > 0) {
View child = getChildAt(0);
scrollRange = Math.max(0, child.getHeight() - (getHeight()));
}
return scrollRange;
}

int currentY;

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (parentScrollView == null) {
return super.onInterceptTouchEvent(ev);
} else {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
// 将父scrollview的滚动事件拦截
currentY = (int)ev.getY();
setParentScrollAble(false);
return super.onInterceptTouchEvent(ev);
} else if (ev.getAction() == MotionEvent.ACTION_UP) {
// 把滚动事件恢复给父Scrollview
setParentScrollAble(true);
} else if (ev.getAction() == MotionEvent.ACTION_MOVE) {
}
}
return super.onInterceptTouchEvent(ev);

}

@Override
public boolean onTouchEvent(MotionEvent ev) {
View child = getChildAt(0);
if (parentScrollView != null) {
if (ev.getAction() == MotionEvent.ACTION_MOVE) {
int height = child.getMeasuredHeight();
height = height - getMeasuredHeight();

// System.out.println("height=" + height);
int scrollY = getScrollY();
// System.out.println("scrollY" + scrollY);
int y = (int)ev.getY();

// 手指向下滑动
if (currentY < y) {
if (scrollY <= 0) {
// 如果向下滑动到头,就把滚动交给父Scrollview
setParentScrollAble(true);
return false;
} else {
setParentScrollAble(false);

}
} else if (currentY > y) {
if (scrollY >= height) {
// 如果向上滑动到头,就把滚动交给父Scrollview
setParentScrollAble(true);
return false;
} else {
setParentScrollAble(false);

}

}
currentY = y;
}
}

return super.onTouchEvent(ev);
}


private void setParentScrollAble(boolean flag) {

parentScrollView.requestDisallowInterceptTouchEvent(!flag);
}

}

436

社区成员

发帖
与我相关
我的任务
社区描述
欢迎来到Xamarin技术交流论坛学习交流,Xamarin是一个行动App开发平台,开发人员透过Xamarin可开发出iOS、Android 与Windows 等平台的...
社区管理员
  • Xamarin技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧