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

Android 在这种情况下,我将使用什么动作事件?,android,android-event,Android,Android Event,我正在使用触控式监听器来显示和隐藏一些音量控制,在“动作”下显示这些控制,在“动作”上隐藏它们。我希望能够在不抬起手指的情况下触摸控制装置,我尝试使用动作移动动作,但无法使其工作,因为事件从未触发。我考虑过拖动事件,但我不确定它是否适用于此 public boolean onTouch(View v, MotionEvent e) { if(v == audioControls) { if(e.getAction() == MotionEvent.ACTION_D

我正在使用触控式监听器来显示和隐藏一些音量控制,在“动作”下显示这些控制,在“动作”上隐藏它们。我希望能够在不抬起手指的情况下触摸控制装置,我尝试使用动作移动动作,但无法使其工作,因为事件从未触发。我考虑过拖动事件,但我不确定它是否适用于此

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;
}
@要求回答,阅读我的评论-以下是代码:

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

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

对你来说,这意味着如果你按下“audioControls”,那么在你松开手指之前,没有其他视图可以捕捉到运动事件

您可以在onTouch方法中返回false。在这种情况下,audioControls的parentView还将捕获所有运动事件。但是视图(它不是视图层次结构中audioControls的父级)不会捕获motionEvent

您需要捕捉容器中视图的所有运动事件,并为自己分派它们。这是从不同视图中的一个链捕获运动事件的唯一方法

更新: 我会再多解释一点。 假设您有这样的布局:

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

您需要触摸view1并将手指移动到view2。Android touch事件流无法做到这一点。只有一个视图可以捕获整个事件链。 因此,您需要将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;
    }
  }
}
public boolean onTouch(运动事件){
float x=event.getX();
float y=event.getY();
对于(int i=0;ichild.getLeft()&&xchild.getTop()){
/*使用此视图执行任何操作。子视图将是view1或view2,具体取决于坐标*/
打破
}
}
}

请注意,我就在那里写了这段代码,可能会犯一些错误。我已经试着说明这个想法。

你能举个例子吗?我在一个视图上用我的action_move尝试了这一点,并尝试在屏幕上随机拖动(不提升),然后在视图上移动,看看它是否触发了事件,但没有。我把代码放在我的编辑器中