Как добавить горизонтальное смахивание с помощью вертикального свайпа?

Я сделал приложение, в котором я добавил функциональность вертикального прокрутки, используя класс ViewPager. Теперь мне нужна помощь, чтобы также добавить горизонтальное смахивание. Я видел несколько проектов на GitHub для вертикального и горизонтального смахивания вместе в одном и том же действии, но не мог понять, как я могу интегрировать это с моим кодом.

Вот как я реализовал вертикальную прокрутку:

Activity_main

<VerticalViewPager
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Основная деятельность

public class MainActivity extends AppCompatActivity SlidingFragment.AppData {

    List<Data> mData = new ArrayList<>();
    ScreenSlidePagerAdapter screenSlidePagerAdapter;
    VerticalViewPager verticalViewPager;
    DatabaseHelper dbHelper = new DatabaseHelper(this);
    public static int DATA_CARDS = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mains);  

        mData = dbHelper.getAll(Data.class);
        DATA_CARDS = mData.size();

        ScreenSlidePagerAdapter screenSlidePagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
        VerticalViewPager verticalViewPager = (VerticalViewPager) findViewById(R.id.pager);
        verticalViewPager.setAdapter(screenSlidePagerAdapter);      
    }

    @Override
    public JSONObject getData(int position) {
        String body = "";
        String imageUrl = "";
        JSONObject jsonObject = new JSONObject();
        try {
            body = mData.get(position).getContent();
            imageUrl = mData.get(position).getImage();

            jsonObject.put("image_url", imageUrl);
            jsonObject.put("body", body);
        } catch (Exception e){
            e.printStackTrace();
        }
        return jsonObject;
    }
}

ЭкранСлайдПейджерАдаптер

public class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {

    private static final int NUM_PAGES = MainActivity.DATA_CARDS;

    public ScreenSlidePagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        SlidingFragment slidingFragment = new SlidingFragment();
        Bundle bundle = new Bundle();
        bundle.putInt("position", position);
        slidingFragment.setArguments(bundle);
        return slidingFragment;
    }

    @Override
    public int getCount() {
        return NUM_PAGES;
    }
}

Вертикальвиевпейджер

public class VerticalViewPager extends ViewPager {

    public VerticalViewPager(Context context) {
        super(context);
        init();
    }

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

    private void init() {
        setPageTransformer(true, new VerticalPageTransformer());]
        setOverScrollMode(OVER_SCROLL_NEVER);
    }

    private class VerticalPageTransformer implements ViewPager.PageTransformer {

        @Override
        public void transformPage(View view, float position) {

            if (position < -1) { // [-Infinity,-1)
                // This page is way off-screen to the left.
                view.setAlpha(0);

            } else if (position <= 1) { // [-1,1]
                view.setAlpha(1);

                // Counteract the default slide transition
                view.setTranslationX(view.getWidth() * -position);

                //set Y position to swipe in from top
                float yPosition = position * view.getHeight();
                view.setTranslationY(yPosition);

            } else { // (1,+Infinity]
                // This page is way off-screen to the right.
                view.setAlpha(0);
            }
        }
    }

    /**
     * Swaps the X and Y coordinates of your touch event.
     */
    private MotionEvent swapXY(MotionEvent ev) {
        float width = getWidth();
        float height = getHeight();

        float newX = (ev.getY() / height) * width;
        float newY = (ev.getX() / width) * height;

        ev.setLocation(newX, newY);

        return ev;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev){
        boolean intercepted = super.onInterceptTouchEvent(swapXY(ev));
        swapXY(ev); // return touch coordinates to original reference frame for any child views
        return intercepted;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return super.onTouchEvent(swapXY(ev));
    }
}

фрагмент_слайдинг

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:fresco="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="MainActivity">

    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/image"
        fresco:roundedCornerRadius="5dp"
        android:layout_width="match_parent"
        android:layout_margin="@dimen/fragment_image_margin"
        android:layout_height="200dp"
        fresco:placeholderImage="@drawable/logo" />

    <TextView
        android:id="@+id/text"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:layout_below="@+id/image"/>
</RelativeLayout>

Раздвижной фрагмент

public class SlidingFragment extends Fragment {

    private AppData mAppData;
    private int mPosition;


    public interface AppData {
        JSONObject getData(int position);
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mAppData = (AppData) context;

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_sliding, container, false);
        return rootView;
    }

    @Override
    public void onResume() {
        super.onResume();
        populateData();
    }

    private void populateData(){
        String body;
        String imageUrl;
        JSONObject jsonObject = mAppData.getData(getArguments().getInt("position"));
        try {
            body = jsonObject.getString("body");
            imageUrl = jsonObject.getString("image_url");
            ((TextView) getView().findViewById(R.id.text)).setText(body);

            Uri uri = Uri.parse(imageUrl);
            SimpleDraweeView draweeView = (SimpleDraweeView) getView().findViewById(R.id.image);
            draweeView.setImageURI(uri);

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

Любая помощь будет оценена.


person Faisal Shaikh    schedule 05.01.2018    source источник
comment
В чем проблема до сих пор?   -  person Aditya    schedule 05.01.2018
comment
@ Heisen-Berg Спасибо, что проявили интерес к моей проблеме. Мне нужно какое-то руководство, чтобы добавить горизонтальное смахивание с вертикальным скольжением, поскольку я понятия не имею, как делать обе вещи в одном действии.   -  person Faisal Shaikh    schedule 05.01.2018
comment
здесь показано, как вы можете добавить событие касания и обнаружить события скольжения со всех сторон. stackoverflow.com/a/48108078/4517450   -  person vikas kumar    schedule 05.01.2018
comment
@vikaskumar после обнаружения жеста смахивания, что делать дальше? Как просмотреть два пейджера в одном действии?   -  person Faisal Shaikh    schedule 05.01.2018
comment
я не уверен в использовании двух просмотровых пейджеров, одного для вертикального и одного для горизонтального, но если вы убедитесь, что скрываете один, прежде чем показывать другой, и наоборот, или вы просто используете фрагменты вместо просмотрового пейджера, и когда одно из направлений в onSwipe просто просто замените существующее фрагмент   -  person vikas kumar    schedule 05.01.2018