检测您的手指在Android中滑过哪个视图

时间:2011-01-29 18:23:49

标签: android view detection

虽然过去曾经问过类似的questions,但他们似乎并没有真正得到回答,这可能是由于对所提问题的混淆所致。

简单地说,当手指滑过屏幕时,我想检测输入的是哪个视图。最好的例子是任何Android手机上的软键盘。当你按任意键时,它会显示为一个弹出窗口,告诉你手指下面有什么字母。如果您现在用一个手势在键盘上移动手指,当您在字母表的各个字母上移动时,会弹出各种字母。

这种行为使用了哪些侦听器。我已经尝试过OnTouchListeners,但它们似乎只有当你“触摸”按钮而不是“手指过去”它们时

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 个答案:

答案 0 :(得分:5)

  • 创建布局
  • 为您的布局添加视图
  • 将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
            }
        }
    }
    

答案 1 :(得分:3)

修改

我看到了键盘。我猜,它只是一个视图,每个字母的坐标都是已知的。因此,您可以轻松计算用户滑过的字母

现在回答:

我不确定,但可能这段代码可以帮助你。

这是遥远的,我为我写的。但是这个想法正在追随。

如果我没记错,视图没有gesturedetector,但你可以将视图的touchlistener与你活动的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;
    }
});

答案 2 :(得分:0)

您可以尝试GestureDetector

答案 3 :(得分:0)

http://android-developers.blogspot.com/2010/06/making-sense-of-multitouch.html 它适合多点触控,但这是了解Android触控/手势的良好开端,下一站,api docs / samples

答案 4 :(得分:0)

简单的答案是你不能 - 在处于辅助功能模式时不喜欢iPhone。

直到冰淇淋三明治。它现在具有类似iPhone的功能,能够识别手指下的元素而无需抬起它。

答案 5 :(得分:0)

手动处理这个问题非常简单。

将您的父布局用作onTouchListener(在以下示例中,我extendRelativeLayout),您可以检查MotionEvent与子{之间的冲突{1}}使用简单的坐标比较逻辑:

View

/** 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个引用。