Определите, какой вид вашего пальца скользит в Android - PullRequest
8 голосов
/ 29 января 2011

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

Проще говоря, яХотелось бы определить, какой вид вводится, когда ваш палец скользит по экрану.Лучшим примером этого в действии является программная клавиатура на любом телефоне Android.Когда вы нажимаете любую клавишу, она появляется в виде всплывающего окна, сообщающего, какая буква находится у вас под пальцем.Если вы теперь одним пальцем проведете пальцем по клавиатуре, появятся различные буквы при перемещении по различным буквам алфавита.

Какие слушатели используются для этого типа поведения.Я пробовал OnTouchListener, но они, кажется, только когда вы «касаетесь» кнопки, а не «пролистываете» их

Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View v) {doStuff();}
});

button.setOnTouchListener(new OnTouchListener() {
  @Override
  public boolean onTouch(View v, MotionEvent event) {
      doStuff();
      return false;
  }
});

OnFocusChangeListener тоже не помогают.

Ответы [ 6 ]

5 голосов
/ 20 июня 2011
  • создать макет
  • добавить виды к вашему макету
  • установить для setOnTouchListener свой макет
  • переопределить метод onTouch следующим образом:

    public boolean onTouch(View v, MotionEvent event) 
    {
       LinearLayout layout = (LinearLayout)v;
    
        for(int i =0; i< layout.getChildCount(); i++)
        {
    
            View view = layout.getChildAt(i);
            Rect outRect = new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
            if(outRect.contains((int)event.getX(), (int)event.getY()))
            {
                                 // over a View
            }
        }
    }
    
3 голосов
/ 30 января 2011

EDIT:

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

И СЕЙЧАС ОТВЕТ:

Я не уверен, но, вероятно, этот код поможет вам.

Это так далеко, я написал это для себя. Но идея заключается в следующем.

Если я правильно помню, для представлений не существует детектора жестов, но вы можете комбинировать сенсорный список представления с geturelistener вашей деятельности.

Как только вы коснулись своего взгляда, у вас есть

private GestureDetector mGestureDetector;

// x and y coordinates within our view
private static float sideIndexX;
private static float sideIndexY;

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    ...
    mGestureDetector = new GestureDetector(this, new SideIndexGestureListener());
}

class MyGestureListener extends
        GestureDetector.SimpleOnGestureListener
{
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2,
            float distanceX, float distanceY)
    {
        // we know already coordinates of first touch
        // we know as well a scroll distance
        sideIndexX = sideIndexX - distanceX;
        sideIndexY = sideIndexY - distanceY;

        // when the user scrolls within our side index
        // we can show for every position in it a proper
        // item in the country list
        if (sideIndexX >= 0 && sideIndexY >= 0)
        {
            doStuff();
        }

        return super.onScroll(e1, e2, distanceX, distanceY);
    }
}    

button.setOnTouchListener(new OnTouchListener()
{
    @Override
    public boolean onTouch(View v, MotionEvent event)
    {
        // now you know coordinates of touch
        // store them
        sideIndexX = event.getX();
        sideIndexY = event.getY();

        doStuff();

        return false;
    }
});
0 голосов
/ 09 сентября 2017

Довольно просто обработать это вручную.

Используя ваш родительский макет в качестве onTouchListener (в следующем примере I extend a RelativeLayout), вы можете проверить наличие коллизий между MotionEvent и дочерними View s, используя простую координату логика сравнения:

/** Returns the View colliding with the TouchEvent. */
private final View getCollisionWith(final MotionEvent pMotionEvent) {
    // Declare the LocationBuffer.
    final int[] lLocationBuffer = new int[2];
    // Iterate the children.
    for(int i = 0; i < this.getChildCount(); i++) { /** TODO: Order. */
        // Fetch the child View.
        final View lView = this.getChildAt(i);
        // Fetch the View's location.
        lView.getLocationOnScreen(lLocationBuffer);
        // Is the View colliding?
        if(pMotionEvent.getRawX() > lLocationBuffer[0] && pMotionEvent.getRawX() < lLocationBuffer[0] + lView.getWidth() && pMotionEvent.getRawY() > lLocationBuffer[1] && pMotionEvent.getRawY() < lLocationBuffer[1] + lView.getHeight()) {
           // Return the colliding View.
           return lView;
        }
    }
    // We couldn't find a colliding View.
    return null;
}

Вызов getCollisionWith вернет View ссылки, которыми можно произвольно манипулировать.

0 голосов
/ 13 февраля 2012

Простой ответ: вы не можете - не нравится iPhone в режиме доступности.

До тех пор, пока это не будет Ice Cream Sandwich.Теперь он имеет iPhone-подобную способность идентифицировать элементы под вашим пальцем, не поднимая его.

0 голосов
/ 29 января 2011

http://android -developers.blogspot.com / 2010/06 / верстка чувственные из-multitouch.html он предназначен для мультитач, но это хорошее начало для понимания касания / жестов Android, следующая остановка, api docs / samples

0 голосов
/ 29 января 2011

Возможно, вы захотите попробовать GestureDetector .

...