单按钮多点触控android

单按钮多点触控android,android,multi-touch,Android,Multi Touch,我有一个带按钮的应用程序,我正在尝试处理多点触控事件。目前我正在使用触控方法,寻找motioneen.ACTION\u DOWN和motioneen.ACTION\u UP来跟踪触控事件。如果同时触摸两个按钮,则此操作正常。但是,我想让按钮在用一根手指触摸时有一种行为,在用更多手指触摸时有不同的行为。例如,如果您用一根手指触摸按钮,该按钮将变为红色;如果您用两根手指触摸按钮,该按钮将变为黄色;如果您用三根手指触摸按钮,该按钮将变为绿色,依此类推 我遇到的问题是,当我用一个以上的手指触摸按钮时,第

我有一个带按钮的应用程序,我正在尝试处理多点触控事件。目前我正在使用触控方法,寻找
motioneen.ACTION\u DOWN
motioneen.ACTION\u UP
来跟踪触控事件。如果同时触摸两个按钮,则此操作正常。但是,我想让按钮在用一根手指触摸时有一种行为,在用更多手指触摸时有不同的行为。例如,如果您用一根手指触摸按钮,该按钮将变为红色;如果您用两根手指触摸按钮,该按钮将变为黄色;如果您用三根手指触摸按钮,该按钮将变为绿色,依此类推


我遇到的问题是,当我用一个以上的手指触摸按钮时,第二次触摸似乎不会触发事件。如何检测同一按钮上的多次触摸?

这是您想要的基本信息。它可能不完全是您想要的,因为手指之间必须留有一些空间,以便识别我以前识别的
MotionEvent
s。如果两个手指靠得很近,它会发出
动作_MOVE
作为
动作事件
。如果你真的需要,你可以解释这些&确定两个或更多的手指是否靠得很近

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private static final int MAX_TOUCHES = 3;

    private View buttonView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        buttonView = findViewById(R.id.button_view);
        buttonView.setOnTouchListener(new View.OnTouchListener() {
            boolean eventConsumed = false;

            // Only handling these 4 events means that there must be some space
            //      between fingers when touching
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                Log.d(TAG, "" + motionEvent.toString());
                switch (motionEvent.getActionMasked()) {
                    case MotionEvent.ACTION_DOWN:
                    case MotionEvent.ACTION_POINTER_DOWN:
                        setButtonColor(motionEvent.getPointerCount());
                        eventConsumed = true;
                        break;

                    case MotionEvent.ACTION_UP:
                    case MotionEvent.ACTION_POINTER_UP:
                        // subtract 1 from the count, this event still includes the touch just removed
                        setButtonColor(motionEvent.getPointerCount() - 1);
                        eventConsumed = true;
                        break;

                    default:
                        break;
                }

                return eventConsumed;
            }
        });
    }

    private void setButtonColor(int count) {
        Log.d(TAG, "count = " + count);

        if(count < 0) {
            count = 0;
        } else if(count > MAX_TOUCHES) {
            count = MAX_TOUCHES;
        }

        switch (count) {
            case 0:
                buttonView.setBackgroundColor(getButtonColor(R.color.colorNotPressed));
                break;

            case 1:
                buttonView.setBackgroundColor(getButtonColor(R.color.colorRed));
                break;

            case 2:
                buttonView.setBackgroundColor(getButtonColor(R.color.colorYellow));
                break;

            case 3:
                buttonView.setBackgroundColor(getButtonColor(R.color.colorGreen));
                break;

            default:
                break;
        }
    }

    // This keeps you from getting a warning about getResources().getColor() being deprecated
    @SuppressWarnings(value = "deprecation")
    private int getButtonColor(int id) {
        int color;

        if(Build.VERSION.SDK_INT >= 23) {
            color = getColor(id);
        } else {
            color = getResources().getColor(id);
        }
        return color;
    }
}
public类MainActivity扩展了AppCompatActivity{
专用静态最终整数最大值=3;
私人视图按钮视图;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
buttonView=findViewById(R.id.button\U视图);
buttonView.setOnTouchListener(新视图.OnTouchListener(){
布尔值=false;
//仅处理这4个事件意味着必须有一些空间
//触摸时手指之间
@凌驾
公共布尔onTouch(视图、运动事件、运动事件){
Log.d(标记“”+motionEvent.toString());
开关(motionEvent.getActionMasked()){
case MotionEvent.ACTION\u DOWN:
case MotionEvent.ACTION\u指针\u向下:
setButtonColor(motionEvent.getPointerCount());
eventconsumered=true;
打破
case MotionEvent.ACTION\u UP:
case MotionEvent.ACTION\u指针\u向上:
//从计数中减去1,此事件仍然包括刚刚移除的触摸
setButtonColor(motionEvent.getPointerCount()-1);
eventconsumered=true;
打破
违约:
打破
}
返回已消耗的事件;
}
});
}
私有void setButtonColor(整数计数){
Log.d(标记“count=”+count);
如果(计数<0){
计数=0;
}否则如果(计数>最大接触次数){
计数=最大接触次数;
}
开关(计数){
案例0:
buttonView.setBackgroundColor(getButtonColor(R.color.colorNotPressed));
打破
案例1:
buttonView.setBackgroundColor(getButtonColor(R.color.colorRed));
打破
案例2:
buttonView.setBackgroundColor(getButtonColor(R.color.colorYellow));
打破
案例3:
buttonView.setBackgroundColor(getButtonColor(R.color.colorGreen));
打破
违约:
打破
}
}
//这可以防止您收到有关getResources()的警告。getColor()不推荐使用
@SuppressWarnings(value=“弃用”)
私有int getButtonColor(int id){
内色;
如果(Build.VERSION.SDK_INT>=23){
color=getColor(id);
}否则{
color=getResources().getColor(id);
}
返回颜色;
}
}
activity_main.xml(不包括AppBar或FAB内容)


在colors.xml文件中使用这些

<color name="colorNotPressed">#606060</color>
<color name="colorRed">#FF0000</color>
<color name="colorYellow">#FFFF00</color>
<color name="colorGreen">#00FF00</color>
#606060
#FF0000
#FFFF00
#00FF00

这是您想要的基本内容。它可能不完全是您想要的,因为手指之间必须留有一些空间,以便识别我以前识别的
MotionEvent
s。如果两个手指靠得很近,它会发出
动作_MOVE
作为
动作事件
。如果你真的需要,你可以解释这些&确定两个或更多的手指是否靠得很近

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private static final int MAX_TOUCHES = 3;

    private View buttonView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        buttonView = findViewById(R.id.button_view);
        buttonView.setOnTouchListener(new View.OnTouchListener() {
            boolean eventConsumed = false;

            // Only handling these 4 events means that there must be some space
            //      between fingers when touching
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                Log.d(TAG, "" + motionEvent.toString());
                switch (motionEvent.getActionMasked()) {
                    case MotionEvent.ACTION_DOWN:
                    case MotionEvent.ACTION_POINTER_DOWN:
                        setButtonColor(motionEvent.getPointerCount());
                        eventConsumed = true;
                        break;

                    case MotionEvent.ACTION_UP:
                    case MotionEvent.ACTION_POINTER_UP:
                        // subtract 1 from the count, this event still includes the touch just removed
                        setButtonColor(motionEvent.getPointerCount() - 1);
                        eventConsumed = true;
                        break;

                    default:
                        break;
                }

                return eventConsumed;
            }
        });
    }

    private void setButtonColor(int count) {
        Log.d(TAG, "count = " + count);

        if(count < 0) {
            count = 0;
        } else if(count > MAX_TOUCHES) {
            count = MAX_TOUCHES;
        }

        switch (count) {
            case 0:
                buttonView.setBackgroundColor(getButtonColor(R.color.colorNotPressed));
                break;

            case 1:
                buttonView.setBackgroundColor(getButtonColor(R.color.colorRed));
                break;

            case 2:
                buttonView.setBackgroundColor(getButtonColor(R.color.colorYellow));
                break;

            case 3:
                buttonView.setBackgroundColor(getButtonColor(R.color.colorGreen));
                break;

            default:
                break;
        }
    }

    // This keeps you from getting a warning about getResources().getColor() being deprecated
    @SuppressWarnings(value = "deprecation")
    private int getButtonColor(int id) {
        int color;

        if(Build.VERSION.SDK_INT >= 23) {
            color = getColor(id);
        } else {
            color = getResources().getColor(id);
        }
        return color;
    }
}
public类MainActivity扩展了AppCompatActivity{
专用静态最终整数最大值=3;
私人视图按钮视图;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
buttonView=findViewById(R.id.button\U视图);
buttonView.setOnTouchListener(新视图.OnTouchListener(){
布尔值=false;
//仅处理这4个事件意味着必须有一些空间
//触摸时手指之间
@凌驾
公共布尔onTouch(视图、运动事件、运动事件){
Log.d(标记“”+motionEvent.toString());
开关(motionEvent.getActionMasked()){
case MotionEvent.ACTION\u DOWN:
case MotionEvent.ACTION\u指针\u向下:
setButtonColor(motionEvent.getPointerCount());
eventconsumered=true;
打破
case MotionEvent.ACTION\u UP: