Android 如何使用触摸屏同时操作两个SeekBar实例(或任何其他控件,如按钮)?

Android 如何使用触摸屏同时操作两个SeekBar实例(或任何其他控件,如按钮)?,android,multi-touch,Android,Multi Touch,我正在开发一个应用程序,可以同时控制多达八首音乐曲目的音量。一个用例是dj动作,通过同时淡出Track1和淡入Track2来混合两个曲目 鉴于上述情况,我创建了一个活动,其中包含两个SeekBar实例,并执行了onProgressChanged(…)事件。现在,我的问题来了!我无法同时控制两个搜索杆。我一次只能演一个 看着Android平台的多点触摸文档,我只能被它的复杂性吓坏了。看着这些代码,我相信解决方案不会存在,至少不会直接存在 有什么想法吗 谢谢, PP构建一个父/布局,将多点触控事件作

我正在开发一个应用程序,可以同时控制多达八首音乐曲目的音量。一个用例是dj动作,通过同时淡出Track1和淡入Track2来混合两个曲目

鉴于上述情况,我创建了一个活动,其中包含两个SeekBar实例,并执行了onProgressChanged(…)事件。现在,我的问题来了!我无法同时控制两个搜索杆。我一次只能演一个

看着Android平台的多点触摸文档,我只能被它的复杂性吓坏了。看着这些代码,我相信解决方案不会存在,至少不会直接存在

有什么想法吗

谢谢,
PP

构建一个父/布局,将多点触控事件作为单独的事件发送给相应的子级


//编辑

构建一个父/布局,将多点触控事件作为单独的事件分派给相应的子级


//编辑

确定。因此,在进一步研究如何处理多点触摸事件并遵循Damian的提示后,我已经达到了截取所有触摸事件的程度,以确定每个指针(在本例中是指)是否在一组预先确定的SeekBar实例、vol1vol2上滑动

下面是关于您的活动的代码:

@覆盖
公共布尔dispatchTouchEvent(MotionEvent ev)
{
Rect sb1Rect=新Rect();
Rect sb2Rect=新Rect();
卷1.getGlobalVisibleRect(sb1Rect);
卷2.getGlobalVisibleRect(sb2Rect);
对于(int i=0;iSeekBar 1->x:“+coordX+”,y:“+coordY”);
}else if(sb2Rect.contains(coordX,coordY)){
Log.d(标记“[PID=“+PID+”]”->seekbar2->x:“+coordX+”,y:“+coordY”);
}
}
LinearLayout l=(LinearLayout)this.findViewById(R.id.linearLayout1);
l、 调度接触事件(ev);
返回true;
}

现在,我只需要根据其相对X坐标(而不是与整个活动相关的绝对坐标)计算每个触摸的SeekBar的值,并相应地设置进度值(.setProgress(int value))。

确定。因此,在进一步研究如何处理多点触摸事件并遵循Damian的提示后,我已经达到了截取所有触摸事件的程度,以确定每个指针(在本例中是指)是否在一组预先确定的SeekBar实例、vol1vol2上滑动

下面是关于您的活动的代码:

@覆盖
公共布尔dispatchTouchEvent(MotionEvent ev)
{
Rect sb1Rect=新Rect();
Rect sb2Rect=新Rect();
卷1.getGlobalVisibleRect(sb1Rect);
卷2.getGlobalVisibleRect(sb2Rect);
对于(int i=0;iSeekBar 1->x:“+coordX+”,y:“+coordY”);
}else if(sb2Rect.contains(coordX,coordY)){
Log.d(标记“[PID=“+PID+”]”->seekbar2->x:“+coordX+”,y:“+coordY”);
}
}
LinearLayout l=(LinearLayout)this.findViewById(R.id.linearLayout1);
l、 调度接触事件(ev);
返回true;
}

现在,我只需要根据其相对X坐标(而不是与整个活动相关的绝对坐标)计算每个触摸的SeekBar的值,并相应地设置进度值(.setProgress(int value))。

亲爱的Damian,您愿意给我提供一个简单的示例或一些伪代码吗,请谢谢,亲爱的达米安,你愿意给我提供一个简单的例子或一些伪代码吗?谢谢,PPI创建了更通用的解决方案:我创建了更通用的解决方案:
@Override
public boolean dispatchTouchEvent (MotionEvent ev)
{
    Rect sb1Rect = new Rect();
    Rect sb2Rect = new Rect();
    vol1.getGlobalVisibleRect(sb1Rect);
    vol2.getGlobalVisibleRect(sb2Rect);

    for (int i = 0; i < ev.getPointerCount(); i++) {
        int pId = ev.getPointerId(i);
        int coordX = (int) ev.getX(i);
        int coordY = (int) ev.getY(i);

        if(sb1Rect.contains(coordX, coordY)) {
            Log.d(TAG, "[PID=" + pId + "] -> SeekBar 1 -> x:" + coordX + ", y:" + coordY);
        } else if (sb2Rect.contains(coordX, coordY)) {
            Log.d(TAG, "[PID=" + pId + "] -> SeekBar 2 -> x:" + coordX + ", y:" + coordY);
        }
    }

    LinearLayout l =(LinearLayout) this.findViewById(R.id.linearLayout1);
    l.dispatchTouchEvent(ev);

    return true;
}