SwipeBack侧滑开源组件冲突问题处理

Posted 子不语归来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SwipeBack侧滑开源组件冲突问题处理相关的知识,希望对你有一定的参考价值。

SwipeBack侧滑开源组件冲突问题处理

SwipeBack github地址:https://github.com/zhibuyu/SwipeBackDemo

智能手机的大屏化,使得单手操作和侧滑返回这两个功能成为了移动开发中常见的需求,本文说的就是侧滑开源组件SwipeBack在常见布局中的一些冲突问题。

常见问题:

  1. Editext滑动冲突
  2. RecyclerView滑动冲突

1.Editext滑动冲突

需求场景:Editext设置单行显示许多文字时,需要左右滑动输入框内的文字,例如顶部搜索输入框。此时右滑会与侧滑返回冲突

解决方案
使用自定义view判断Editext何时滑动到最左端再去控制整个布局是否侧滑

public class MyEditext extends android.support.v7.widget.AppCompatEditText 
private ScrollViewListener scrollViewListener = null;
private boolean can_touch;
public interface ScrollViewListener 
void onScrollChanged(MyEditext editext, int x, int y,
 int oldx, int oldy);

public MyEditext(Context context) 
super(context);


public MyEditext(Context context, AttributeSet attrs) 
super(context, attrs);


public MyEditext(Context context, AttributeSet attrs, int defStyleAttr) 
super(context, attrs, defStyleAttr);

@Override
public boolean dispatchTouchEvent(MotionEvent ev) 
if (getParent() != null) 
getParent().requestDisallowInterceptTouchEvent(can_touch);

return super.dispatchTouchEvent(ev);


public void setCan_touch(boolean can_touch) 
this.can_touch = can_touch;

@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) 
super.onScrollChanged(l, t, oldl, oldt);
if (scrollViewListener != null) 
scrollViewListener.onScrollChanged(this, l, t, oldl, oldt);


public void setScrollViewListener(ScrollViewListener scrollViewListener) 
this.scrollViewListener = scrollViewListener;


使用此自定义view时(signatureEdit为MyEditext自定义view)

核心代码:

 private boolean leftEnd;//判断是否滑动到最左端

 signatureEdit.setScrollViewListener(new MyEditext.ScrollViewListener() 
        @Override
        public void onScrollChanged(MyEditext v, int x, int y, int oldx, int oldy) 
            if (v.getScrollX() > 0) 
                leftEnd = false;
             else 
                leftEnd = true;
            
        
    );
    signatureEdit.setOnTouchListener(new View.OnTouchListener() 
        @Override
        public boolean onTouch(View view, MotionEvent event) 
            EditTextOnTouch(view,event,signatureEdit,leftEnd);
            return false;
        
    );

private void EditTextOnTouch(View view, MotionEvent event,MyEditext myEditext,boolean flag) 
    switch (event.getAction()) 
        case MotionEvent.ACTION_DOWN:
            break;
        case MotionEvent.ACTION_MOVE:
            if (view instanceof EditText) 
                if (flag)
                    myEditext.setCan_touch(false);
                else 
                    myEditext.setCan_touch(true);
                
                setEnableSwipe(flag);
            
            break;
        case MotionEvent.ACTION_UP:
            setEnableSwipe(true);
            break;
        case MotionEvent.ACTION_CANCEL:
            setEnableSwipe(true);
            break;
    

注释 setEnableSwipe((boolean enableSwipe)为设置是否支持滑动返回,上面分享的开源代码的基类中已包含

2.RecyclerView滑动冲突

需求场景:RecyclerView滑动方向和SwipeBack滑动方向一致,滑动出现冲突

解决方案
同样判断RecyclerView何时滑动到最左端再去控制整个布局是否侧滑
可以外层包一个自定义ScrollView,也可以直接判断RecyclerView是否滑动到最左端,根据需求而定,我这是需要外层加个ScrollView
核心代码:

自定义横向ScrollView

public class MySwipeRecyclerView extends RecyclerView 

boolean isIntercept=true;
public MySwipeRecyclerView(Context context) 
super(context);


public MySwipeRecyclerView(Context context, @Nullable AttributeSet attrs) 
super(context, attrs);


public MySwipeRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) 
super(context, attrs, defStyle);


@Override
public boolean dispatchTouchEvent(MotionEvent ev) 
if (getParent() != null) 
getParent().requestDisallowInterceptTouchEvent(isIntercept);

return super.dispatchTouchEvent(ev);


public void setIntercept(boolean intercept) 
isIntercept = intercept;

使用 (photoscrv为自定义ScrollView)

private boolean isleftEnd;

photoscrv.setScrollViewListener(new MyHorizontalScrollView.ScrollViewListener() 
@Override
public void onScrollChanged(MyHorizontalScrollView v, int x, int y, int oldx, int oldy) 
    if (v.getScrollX() > 0) 
        isleftEnd = false;
       else 
         isleftEnd = true;
      
      
      );


 photoRecyclerview.setOnTouchListener(new View.OnTouchListener() 
        @Override
        public boolean onTouch(View v, MotionEvent event) 
            switch (event.getAction()) 
                case MotionEvent.ACTION_DOWN:
                    break;
                case MotionEvent.ACTION_MOVE:
                    if (v instanceof RecyclerView) 
                        setEnableSwipe(isleftEnd);
                    
                    break;
                case MotionEvent.ACTION_UP:
                    setEnableSwipe(true);
                    break;
                case MotionEvent.ACTION_CANCEL:
                    setEnableSwipe(true);
                    break;
            
            return true;
        
    );

3.Viewpager滑动已在源码中处理

SwipeBack github地址:https://github.com/zhibuyu/SwipeBackDemo

以上是关于SwipeBack侧滑开源组件冲突问题处理的主要内容,如果未能解决你的问题,请参考以下文章

(转)ViewDragHelper实现QQ5.0侧滑并处理与ViewPager的滑动冲突

侧滑手势控制器连动的效果,回到上一个控制器

侧滑SilidingMenu ,ViewPager 和,PagerIndicator 冲突

Android侧滑菜单和轮播图之滑动冲突

IOS侧滑返回和滑动视图的之间的冲突

IOS侧滑返回和滑动视图的之间的冲突