事件冲突分为三种:同向(例如 都是竖直方向) 异向(横竖方向) 混合
记录一下同向的冲突解决 ,其他类似
现在有NestScrollView 但是为了了解冲突 用一个ScrollView嵌套另一个Scrollview制造冲突
解决思想:(同向)当子view向上滑动,并且可以滑动(未到底部),则事件有子view处理,当子view到达底部,向上滑动,事件由父view处理
(异向)比较水平和垂直方向滑动距离绝对值,决定事件处理
1 布局(demo 没有format ~.~)
<?xml version="1.0" encoding="utf-8"?>
<com.example.zhengyongbo.myapplicationscrollviewconflict.MyScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:id="@+id/parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="1111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-9888888888888888888888888888888888888"
/>
<ScrollView
android:id="@+id/child"
android:layout_width="match_parent"
android:layout_height="350dp"
android:fillViewport="true"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="350dp"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="最后 说下 通常 SwipeRefreshLayout 应该要包裹一个 可以滑动的 控件,且是一个控件,并不应当 包裹两个可滑动的控件,或者一个没有滑动事件的 ViewGroup.
如果包裹一个不带滑动的ViewGroup 就会引发 滑动冲突的问题。最后 说下 通常 SwipeRefreshLayout 应该要包裹一个 可以滑动的 控件,且是一个控件,并不应当 包裹两个可滑动的控件,或者一个没有滑动事件的 ViewGroup.
如果包裹一个不带滑动的ViewGroup 就会引发 滑动冲突的问题。最后 说下 通常 SwipeRefreshLayout 应该要包裹一个 可以滑动的 控件,且是一个控件,并不应当 包裹两个可滑动的控件,或者一个没有滑动事件的 ViewGroup.
如果包裹一个不带滑动的ViewGroup 就会引发 滑动冲突的问题。最后 说下 通常 SwipeRefreshLayout 应该要包裹一个 可以滑动的 控件,且是一个控件,并不应当 包裹两个可滑动的控件,或者一个没有滑动事件的 ViewGroup.
如果包裹一个不带滑动的ViewGroup 就会引发 滑动冲突的问题。最后 说下 通常 SwipeRefreshLayout 应该要包裹一个 可以滑动的 控件,且是一个控件,并不应当 包裹两个可滑动的控件,或者一个没有滑动事件的 ViewGroup.
如果包裹一个不带滑动的ViewGroup 就会引发 滑动冲突的问题。最后 说下 通常 SwipeRefreshLayout 应该要包裹一个 可以滑动的 控件,且是一个控件,并不应当 包裹两个可滑动的控件,或者一个没有滑动事件的 ViewGroup.
如果包裹一个不带滑动的ViewGroup 就会引发 滑动冲突的问题。最后 说下 通常 SwipeRefreshLayout 应该要包裹一个 可以滑动的 控件,且是一个控件,并不应当 包裹两个可滑动的控件,或者一个没有滑动事件的 ViewGroup.
如果包裹一个不带滑动的ViewGroup 就会引发 滑动冲突的问题。最后 说下 通常 SwipeRefreshLayout 应该要包裹一个 可以滑动的 控件,且是一个控件,并不应当 包裹两个可滑动的控件,或者一个没有滑动事件的 ViewGroup.
如果包裹一个不带滑动的ViewGroup 就会引发 滑动冲突的问题。最后 说下 通常 SwipeRefreshLayout 应该要包裹一个 可以滑动的 控件,且是一个控件,并不应当 包裹两个可滑动的控件,或者一个没有滑动事件的 ViewGroup.
如果包裹一个不带滑动的ViewGroup 就会引发 滑动冲突的问题。最后 说下 通常 SwipeRefreshLayout 应该要包裹一个 可以滑动的 控件,且是一个控件,并不应当 包裹两个可滑动的控件,或者一个没有滑动事件的 ViewGroup.
如果包裹一个不带滑动的ViewGroup 就会引发 滑动冲突的问题。"/>
</LinearLayout>
</ScrollView>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="1111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-98888888888888888888888888888888888881111111111132322222222222222222222222222222222-9888888888888888888888888888888888888"
/>
</LinearLayout>
</com.example.zhengyongbo.myapplicationscrollviewconflict.MyScrollView>
2 外部拦截事件 (可以内部子view拦截)
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.ScrollView;
public class MyScrollView extends ScrollView{
private View mScrollUpChild;
private float startY;
private int mTouchSlop;
public void setScrollUpChild(View view) {
mScrollUpChild = view;
}
public MyScrollView(Context context) {
super(context);
}
public MyScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if(mScrollUpChild==null) {
Log.e("eventButton","null");
return true;
}
switch (ev.getAction()){
case MotionEvent.ACTION_DOWN:
// 记录手指按下的位置
startY = ev.getY();
break;
case MotionEvent.ACTION_MOVE:
float endY = ev.getY();
float distanceY = Math.abs(endY - startY);
float y =endY- startY;
if(distanceY > mTouchSlop && y > 0){
if(!mScrollUpChild.canScrollVertically(-1)){//sdk 14以上
return true;
}else {
return false;
}
}
if(distanceY > mTouchSlop && y <0){
if(!mScrollUpChild.canScrollVertically(1)){
return true;
}else {
return false;
}
}
break;
}
return super.onInterceptTouchEvent(ev);//这个地方很重要
}
}
3 MainActivity
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ScrollView;
public class MainActivity extends AppCompatActivity {
private MyScrollView myScrollView;
private ScrollView scrollView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myScrollView=findViewById(R.id.parent);
scrollView=findViewById(R.id.child);
myScrollView.setScrollUpChild(scrollView);
}
}
水平有限,如有错误,敬请指正