Как включить прослушивание касаний в пейджере просмотра в Android? - PullRequest
6 голосов
/ 05 марта 2012

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

Код:

viewPager.setOnTouchListener(new OnTouchListener(){

            @Override
            public boolean onTouch(View v, MotionEvent event)
            {

                     mDetector.onTouchEvent(event);
                     return true;   



            }});

Для приведенного выше кода я могу захватить событие касания, но действие смахивания становится невозможным.

Ответы [ 5 ]

25 голосов
/ 03 августа 2012

Здесь я оставляю вам фрагмент из моего кода, чтобы обнаружить «щелчок» на OnTouchListener, надеюсь, это поможет

mImagePager.setOnTouchListener(new OnTouchListener() {
        private float pointX;
        private float pointY;
        private int tolerance = 50;
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch(event.getAction()){
            case MotionEvent.ACTION_MOVE:
                return false; //This is important, if you return TRUE the action of swipe will not take place.
            case MotionEvent.ACTION_DOWN:
                pointX = event.getX();
                pointY = event.getY();
                break;
            case MotionEvent.ACTION_UP:
                boolean sameX = pointX + tolerance > event.getX() && pointX - tolerance < event.getX();
                boolean sameY = pointY + tolerance > event.getY() && pointY - tolerance < event.getY();
                if(sameX && sameY){
                    //The user "clicked" certain point in the screen or just returned to the same position an raised the finger
                }
            }
            return false;
        }
    });
4 голосов
/ 30 мая 2012

Мы можем использовать жесты ( Link1 , Link2 ):

public boolean onTouchEvent (MotionEvent ev)

Надеюсь, это поможет!

2 голосов
/ 05 марта 2012

Нэнси, вам не нужно вручную отменять перелистывание страниц или сенсорные события. Просто добавьте страницы в ViewPager, и ViewPager автоматически позаботится о смахивании.

Тем не менее, вам необходимо подключить сенсорные приемники к объекту на каждой странице. Так что, если на странице 1 имеется линейный макет со многими кнопками, и вам необходимо выяснить, когда эти кнопки нажимаются, вы необходимо прикрепить OnClickListeners для каждой из этих кнопок.

Дайте мне знать ваш вариант использования, чтобы мы могли лучше понять, почему вам нужно выяснить, когда была нажата страница!

0 голосов
/ 02 декабря 2015

Поместите событие click в представление элемента viewpager внутри viewPagerAdapter в методе instantiateItem like -

       @Override
        public Object instantiateItem(ViewGroup container, final int position) {

            // Declare Variables
            ImageView jive_image;

            inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View itemView = inflater.inflate(R.layout.list_item_viewpager, container,
                    false);

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

                    onBackPressed();
                }
            });




            // Add viewpager_item.xml to ViewPager
            ((ViewPager) container).addView(itemView);

            return itemView;
        }
0 голосов
/ 10 сентября 2013

Просто, чтобы добавить отличный ответ Хорхе, вы можете просто использовать расстояние вместо sameX и sameY, что немного элегантнее. Пример:

// Ignore events that are swipes rather then touches
float distX = event.getX() - pointX;
float distY = event.getY() - pointX;
double dist = Math.sqrt(distX * distX + distY * distY);
if (dist > tolerance) {
  return false;
}
...