我正在使用触摸式监听器来显示和隐藏一些音量控制,在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 :(得分: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;
}
}
}
请注意,我在那里编写了这段代码,可能会犯一些错误。我试图表明这个想法。