View事件冲突

事件冲突分为三种:同向(例如 都是竖直方向) 异向(横竖方向) 混合

记录一下同向的冲突解决 ,其他类似

现在有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);
    }
}

水平有限,如有错误,敬请指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值