2015-01-21 50 views
0

我正在使用触摸监听器来显示和隐藏一些音量控件,在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; 
} 

回答

0

所以,你需要uderstand触摸事件是如何工作的机器人。如果触及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> 

而且要降落在厂景和移动你的手指视图2。 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; 
    } 
    } 
} 

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

+0

你能举个例子吗?我在单个视图中用我的action_move试了一下,并尝试在屏幕上随意拖动(而不是抬起),然后在视图上移动以查看它是否触发了事件,但事实并非如此。我把代码放在我的编辑 – joe 2015-01-21 10:09:20

+0

@joe我更新了我的答案。 – 2015-01-23 11:19:47

相关问题