开发者

Detect which view your finger is sliding over in Android

While similar questions have been asked in the past they don't seem to really have been answered which might be due to confusion as to what's being asked.

Put simply, I'd like to detect which view is being entered as your finger slides over the screen. The best example of this in action is the soft keyboard on any android phone. When you press any key it shows up as a popup to tell you what letter is under your finger. If you now move your finger over the keyboard in a single gesture the various letters pop up as you move over the various letters of the alphabet.

What listeners are used for this type of behaviour. I've tried OnTouchListeners but they seem to be only when you 'touch' the button as opposed to 'f开发者_运维问答inger past' them

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 don't help either.


  • create a Layout
  • add Views to your Layout
  • set the setOnTouchListener to your Layout
  • override the onTouch method with the following:

    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
            }
        }
    }
    


EDIT:

I saw keyboard. I guess, it just one view and coordinates of every letter is known. So you can easily compute which letter the user slides through

AND NOW THE ANSWER:

I'm not sure, but probably this code helps your.

It's so far away, I wrote it for me. But the idea is following.

If I remember right, there is no gesturedetector for views, but you can combine touchlistener of the view with geturelistener of your activity.

Once you've touched your view, you have

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;
    }
});


You may want to try GestureDetector.


http://android-developers.blogspot.com/2010/06/making-sense-of-multitouch.html it's geared to multitouch, but this is a good start toward understanding android touch/gestures, next stop, api docs/samples


The simple answer is you can't - not like the iPhone when in accessibility mode.

Until Ice Cream Sandwich that is. It now has the iPhone-like capability of being able to identify elements under your finger without having to lift it.


It's fairly straight forward to handle this manually.

Using your parent layout as the onTouchListener (in the following example, I extend a RelativeLayout), you can check for collisions between a MotionEvent and the child Views using simple co-ordinate comparison logic:

/** 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;
}

Calls to getCollisionWith will return View references that may be manipulated arbitrarily.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜