GridView onTouch - PullRequest
       1

GridView onTouch

3 голосов
/ 13 мая 2010

Я пытаюсь настроить GridView кнопок, которые реагируют на onTouch. Например, если я проведу пальцем по экрану по горизонтали, вертикали или диагонали, я хочу, чтобы кнопки, к которым вы прикоснулись, были выбраны. Я попытался установить OnTouchListener для кнопок, но это не сработало, только первая кнопка в событии перетаскивания получила события onTouch.

Затем я попытался создать OnTouchListener для GridView и затем использовать координаты X, Y, чтобы определить, какие кнопки касались. Кажется, это тоже не работает, так как события MOTION_DOWN передаются в onTouch () GridView только в том случае, если я начинаю перетаскивание на самом краю GridView. На самом деле, если я перетаскиваю палец горизонтально по сетке, события onTouch вообще не запускаются, если я не начну перетаскивание на краю GridView. Кто-нибудь знает лучший способ сделать это?

Заранее спасибо.

gridview.setOnTouchListener(new View.OnTouchListener()
{
 @Override
 public boolean onTouch(@SuppressWarnings("unused") View view, MotionEvent event)
 {
  float X = event.getX();
  float Y = event.getY();

  switch (event.getAction()) { 
  case MotionEvent.ACTION_DOWN:
   System.out.println("Down: " + X + "," + Y);
   break;
  case MotionEvent.ACTION_MOVE:
   System.out.println("Move: " + X + "," + Y);
   break;
  case MotionEvent.ACTION_UP: 
   System.out.println("Up: " + X + "," + Y);
   break; 
  }

  return true;
 }
}

Ответы [ 4 ]

1 голос
/ 29 сентября 2011

Если у вас есть адаптер, реализующий интерфейс для прослушивания событий щелчка на вашей ячейке сетки, например:

public interface OnSaveEditsListener
{
    public abstract void onSaveEdits();
}

private OnSaveEditsListener saveEditsListener = null;
public void setOnSaveEditsListener(OnSaveEditsListener l) {
    saveEditsListener = l;
}

И вы должны реализовать в своем адаптере метод getView (..), специальный прослушиватель щелчков:

        holder.gridcell.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                CalendarPosition = position;
                v.requestFocusFromTouch();

                try{
                    saveEditsListener.onSaveEdits();
                    holder.gridcell.invalidate();
                }catch(Exception ex){}

            }
        });

Рекомендуется использовать держатель для элементов обзора внутри адаптера.

И последняя часть из вашего занятия, просто позвоните:

    adapter.setOnSaveEditsListener(new GridCellAdapter.OnSaveEditsListener() {

        @Override
        public void onSaveEdits() {
            /** methods  *//
    });
}
0 голосов
/ 11 декабря 2012

Вы на правильном пути. Вам просто нужно использовать координаты X, Y из onTouch, чтобы получить положение ячейки сетки, используя метод gridView pointToPosition. Затем вы можете использовать позицию (ID), чтобы получить фактический элемент в ячейке, используя метод getChildAt. Например, если у вашего gridView есть TextView в каждой ячейке, используйте эту

int position = gridView.pointToPosition((int) currentXPosition, (int) currentYPosition);
TextView tv = (TextView) gridView.getChildAt(position);
0 голосов
/ 24 февраля 2012

Это не полный, но может помочь вам

gridview.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {

            if(event.getAction() == MotionEvent.ACTION_MOVE){
                gridview.requestFocusFromTouch();
                gridview.setSelection(gridview.pointToPosition((int)event.getX(),(int)event.getY()));
                return true;
            }
            if(event.getAction() == MotionEvent.ACTION_UP){
                gridview.clearFocus();
                return true;
            }

            return false;
        }
    });
0 голосов
/ 27 июля 2011

Возможно, вы захотите попробовать использовать GestureDetector, чтобы вызвать правильные сенсорные события. С этого момента вы сможете определить, что вы сделали и где именно.

GestureDetector предоставит вам несколько методов, сообщающих вам, что вы сделали (SingleTapUp, Fling, Scroll, ...) и на какой позиции и как долго вы это делали (если вы, например, проводите, вы получаете начальную позицию, продолжительность и как далеко вы ударили)

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