Как реализовать одновременно события OnClick и Sliding для ImageFlipper в Android

Я пытаюсь разработать флиппер изображения Android со следующим поведением.

  1. Он автоматически начинает переворачиваться, когда начинается действие (перелистывание интервал также был реализован).
  2. Пользователи также могут перемещать изображения во флиппере вправо или влево.
  3. Пользователи должны иметь возможность щелкнуть определенное изображение и загрузить другое. активность

Пункт 1 я мог успешно реализовать без проблем.

Проблема в том, что я не могу реализовать 2 и 3 одновременно, потому что imageView.OnClickListner() всегда идет первым перед запуском Flipper.OnTouch() Листнера. Таким образом, скольжения никогда не происходит, но новая активность загружается сразу.

Как я могу одновременно реализовать все 3 требования в своем приложении для Android?

public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {

        View root = inflater.inflate(R.layout.fragment_home, container, false);

        int sliderImgs[] = {R.drawable.slider_img_1, R.drawable.slider_img_1, R.drawable.slider_img_1};
        viewFlipper = root.findViewById(R.id.img_slider);
        mContext = this.getContext();
        viewFlipper.setAutoStart(true);
        viewFlipper.setFlipInterval(20000);

        viewFlipper.setInAnimation(this.getContext(), R.anim.slide_in_right);
        viewFlipper.setOutAnimation(this.getContext(), R.anim.slide_out_left);
        viewFlipper.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(final View view, final MotionEvent event) {
                detector.onTouchEvent(event);
                return true;
            }
        });

        for(int sliderImg:sliderImgs){
            slideshowImages(sliderImg);
        }
}

    private void slideshowImages(int image){
        ImageView imageView = new ImageView(this.getContext());
        imageView.setBackgroundResource(image);

        viewFlipper.addView(imageView);

        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                View notificaionFragment = getLayoutInflater().inflate(R.layout.fragment_property_details, null);
                BottomSheetDialog bottomSheetDialog = arrangeBottomSheet(notificaionFragment);
                new Notification(notificaionFragment, mContext, getLayoutInflater(), bottomSheetDialog);
            }
        });
}

Что вы пробовали? Любой код?

Sơn Phan 14.12.2020 11:33

Не могли бы вы показать нам код? Я хотел бы знать, является ли флиппер пользовательской реализацией

Jorge Martinez 14.12.2020 11:37

@JorgeMartinez Добавил фрагмент кода. пожалуйста, проверьте

Udara Seneviratne 14.12.2020 11:42
0
3
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Что я сделал, так это установил порог... Я отслеживаю движение пальца на экране; если он достигает определенного числа, я рассматриваю это как флип; в противном случае это щелчок по кнопке (или ImageView или что-то еще) и вызовите PerformClick.

@Override
        public boolean onTouch(View v, MotionEvent event) {
            int action = event.getActionMasked();
            switch (action) {
                case MotionEvent.ACTION_DOWN:
                    startX = event.getX();
                    break;
                case MotionEvent.ACTION_UP:

                    float endX = event.getX();
                    float endY = event.getY();
                    //swipe right
                    if (startX > endX && (startX - endX) > 10.0) {
                        if (pageIndex < totalPages) {
                            pageIndex++;
                            vFlipper.setInAnimation(EventActivity.this, R.anim.transition_in_left);
                            vFlipper.setOutAnimation(EventActivity.this, R.anim.transition_out_left);
                            vFlipper.showNext();
                        }

                    } else if ((startX - endX) > 0 && (startX - endX) < 10.0) {
                        v.performClick();
                    }
                    float operacion = Math.abs(startX - endX);
                    if (startX < endX && operacion > 10.0) {
                        if (pageIndex > 1) {
                            pageIndex--;
                            vFlipper.setInAnimation(EventActivity.this, R.anim.transition_in_right);
                            vFlipper.setOutAnimation(EventActivity.this, R.anim.transition_out_right);
                            vFlipper.showPrevious();
                        }
                    } else if (operacion < 10 && operacion != 0) {
                        v.performClick();
                    }

                    if (startX - endX == 0) {
                        v.performClick();
                    }

                    break;
            }
            return true;
        }

Ну... Глядя на вашу реализацию, я бы посоветовал вам вместо этого использовать viewPager, он более удобен для пользователя, вы можете легко добавлять фрагменты или представления и менее сложно. https://androidwave.com/auto-scroll-viewpager-android/ взгляните на этот туториал, он отлично работает, я использовал его для реализации пользовательского viewPager в одном из моих приложений!

Другие вопросы по теме