Android Swipe Жест, что родительская активность не может перехватить - PullRequest
0 голосов
/ 27 апреля 2018

Я работал над жестами смахивания андроида, применил жест смахивания к элементу внутри представления рециркулятора, а представление рециркулятора находится внутри фрагмента, а затем фрагмент внутри действия, а действие имеет вид прокрутки. Проблема заключалась в том, что родительское действие перехватывало жест смахивания элемента внутри взгляд ребенка, после стольких усилий я нашел решение, и этот код работает нормально. Есть ли какое-нибудь другое лучшее решение этой проблемы? если да, то опубликуйте его в ответ, в противном случае проголосуйте за мой код, чтобы я мог использовать его в своем приложении, не опасаясь неудачи. Вот мой код

      listingView.setOnTouchListener(new OnSwipeTouchListener(myContext)
        {


        public void onClick() {
            ViewListing();
        }
        //           @Override
        public boolean onTouch(View v, MotionEvent event) {


            switch (event.getActionMasked())
            {
                case MotionEvent.ACTION_DOWN:
                    x1 = event.getX();
                    break;
                case MotionEvent.ACTION_UP:
                    LockableScrollView.setScrollingEnabled(true);
                    break;
                case MotionEvent.ACTION_MOVE:
                    x2 = event.getX();
                    float deltaX = x2 - x1;

                    if (Math.abs(deltaX) > 20)
                    {
                        LockableScrollView.setScrollingEnabled(false);
                        // Left to Right swipe action
                        if (x2 > x1)
                        {
                            hideSidePanel();
                            LockableScrollView.setScrollingEnabled(true);

                        }

                        else
                        //MH: Right to Left Swipe
                        {

                            showSidePanel();
                            LockableScrollView.setScrollingEnabled(true);
                        }

                    }
                    break;

            }
            return super.onTouch(v, event);
        }


    });

Блокируемая прокрутка Просмотр кода

             public class LockableScrollView extends ScrollView {

   @Override
   public void setClipChildren(boolean clipChildren) {
    clipChildren=false;
    super.setClipChildren(clipChildren);
  }

  @Override
  public void setFocusable(int focusable) {
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        focusable=View.NOT_FOCUSABLE;
      }
       super.setFocusable(focusable);
 }

 // true if we can scroll (not locked)
 // false if we cannot scroll (locked)
 private static boolean mScrollable = true;

 public LockableScrollView(Context context) {
     super(context);
 }

 public LockableScrollView(Context context, AttributeSet attrs) {
    super(context, attrs);
 }

   public LockableScrollView(Context context, AttributeSet attrs, int     defStyleAttr)    {
    super(context, attrs, defStyleAttr);
  }

  @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
  public LockableScrollView(Context context, AttributeSet attrs, int    defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
  }

 public static void setScrollingEnabled(boolean enabled) {
    mScrollable = enabled;
  }

public static boolean isScrollable() {
    return  mScrollable;
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            //MH: if we can scroll pass the event to the superclass
            if (mScrollable) return super.onTouchEvent(ev);
            //MH: only continue to handle the touch event if scrolling enabled
            return mScrollable; // mScrollable is always false at this point
        default:
            return super.onTouchEvent(ev);
    }
  }

@Override
  public boolean onInterceptTouchEvent(MotionEvent ev) {
    //MH: Don't do anything with intercepted touch events if
    //MH: we are not scrollable
    if (!mScrollable) return false;
    else return super.onInterceptTouchEvent(ev);
    }

   }
...