我会在这种情况下使用什么动作事件?

时间:2015-01-21 06:50:50

标签: android android-event

我正在使用触摸式监听器来显示和隐藏一些音量控制,在ACTION_DOWN上显示控件,在ACTION_UP上隐藏它们。我希望能够在不抬起手指的情况下触摸控件,我尝试使用ACTION_MOVE动作并且无法使其工作,因为事件从未被触发。我想过拖动事件,但我不确定它是否适合这个。

public boolean onTouch(View v, MotionEvent e)
{
    if(v == audioControls)
    {
        if(e.getAction() == MotionEvent.ACTION_DOWN)
            showVolumeControls();
        else if(e.getAction() == MotionEvent.ACTION_UP)
            hideVolumeControls();

    }


    else if(e.getAction() == MotionEvent.ACTION_MOVE)
    {
        if(v == mute)
        //Do stuff with this volume control
    }

    return true;
}

@Demand回答,阅读我的评论 - 这是代码:

public boolean onTouch(View v, MotionEvent e)
{
if(v == mute && e.getAction() == MotionEvent.ACTION_MOVE)
{
Toast.makeText(getApplicationContext(), "Muted.", Toast.LENGTH_SHORT).show();
hideVolumeControls();
return true;
}
else
return false;
}

1 个答案:

答案 0 :(得分:0)

因此,您需要了解android触摸事件的工作原理。如果你触及View1,为该视图设置onTouchListener并为该事件返回true - 其他视图永远不会从同一链中获取动作事件。

对你来说,这意味着如果你触及" audioControls"然后在释放手指之前,没有其他视图可以捕捉到动作事件。

您可以在onTouch方法中返回false。在这种情况下,用于audioControls的parentView也将捕获所有motionEvents。但是,视图层次结构中不是audioControls父级的视图将不会捕获motionEvent。

您需要捕获容器中的所有运动事件以供您查看并为自己调度它们。这是在不同视图中从一个链捕获motionEvents的唯一方法。

更新: 我会尝试解释一下。 想象一下,你有这样的布局:

<LinearLayout id="@+id/container">
  <View id="@+id/view1"/>
  <View id="@+id/view2"/>
</LinearLayout>

你想要触及view1并将手指移动到view2。 Android触摸事件流无法执行此操作。只有一个视图可以捕获整个事件链。 因此,您需要将onTouchListener添加到容器中并执行类似的操作。

public boolean onTouch(MotionEvent event) {
  float x = event.getX();
  float y = event.getY();
  for (int i = 0; i<container.getChildCount(); i++) {
    View child = container.getChildAt(i);
    if (x>child.getLeft() && x < child.getRight() && y < child.getBottom() && y > child.getTop()) {
      /*do whatever you want with this view. Child will be view1 or view2, depends on coords;*/
      break;
    }
  }
}

请注意,我在那里编写了这段代码,可能会犯一些错误。我试图表明这个想法。