Java Android多点触摸问题

Java Android多点触摸问题,java,android,multi-touch,Java,Android,Multi Touch,所以我正在做一个游戏,两个玩家同时在一个屏幕上玩。为了简单起见,假设两个玩家在屏幕的一侧都有一个按钮,即按钮B[0]和按钮B[1]。我想实现多点触控,这样两个按钮都可以无响应地按下,但一旦其中一个按下按钮,另一个按钮就会无响应。我阅读了所有重复的问题,并了解到第二次触摸将被称为动作指针向下,因此我编写了以下代码: @Override public boolean onTouch(View buttonPressed, MotionEvent action) {

所以我正在做一个游戏,两个玩家同时在一个屏幕上玩。为了简单起见,假设两个玩家在屏幕的一侧都有一个按钮,即按钮B[0]和按钮B[1]。我想实现多点触控,这样两个按钮都可以无响应地按下,但一旦其中一个按下按钮,另一个按钮就会无响应。我阅读了所有重复的问题,并了解到第二次触摸将被称为动作指针向下,因此我编写了以下代码:

@Override
    public boolean onTouch(View buttonPressed, MotionEvent action) 
    {
        if(buttonPressed.getId()==B[0].getId())
        {
             if(action.getAction() == MotionEvent.ACTION_DOWN || action.getAction() == MotionEvent.ACTION_POINTER_DOWN)
                B[0].setImageDrawable(BPressed[0]);
             if(action.getAction() == MotionEvent.ACTION_UP || action.getAction() == MotionEvent.ACTION_POINTER_UP)
                B[0].setImageDrawable(BOk[0]);    
        }
        if(buttonPressed.getId()==B[1].getId())
        {
             if(action.getAction() == MotionEvent.ACTION_DOWN || action.getAction() == MotionEvent.ACTION_POINTER_DOWN)
                B[1].setImageDrawable(BPressed[1]);
             if(action.getAction() == MotionEvent.ACTION_UP || action.getAction() == MotionEvent.ACTION_POINTER_UP)
                B[1].setImageDrawable(BOk[1]);    
        }
        return true;
    }
因此,就我所知,如果我把一个手指放在B[0]上,然后把它放在那里(没有动作向上),然后再把另一个手指放在B[1]上,监听器应该按一下(B[1],动作向上,指针向下),但我想,自从我这样做之后,B[0]已经被按下了,B[1]已经被按下了。我哪里出错了?抱歉,如果我复制了一份,但我阅读了所有内容,似乎找不到简单的解决方案。关于这个问题,我找到的每一个解决方案都比我需要的多得多

两个按钮都与侦听器连接,如下所示:

B[0].setOnTouchListener(this);
B[1].setOnTouchListener(this);
我读过:

ACTION_POINTER_DOWN and ACTION_POINTER_UP are fired whenever a secondary pointer goes down or up.
但这似乎不是真的

编辑:

新代码,仍然是相同的结果:

        @Override
        public boolean onTouch(View buttonPressed, MotionEvent action) 
        {
if( buttonPressed.getId()==B[1].getId() )
             Toast.makeText(context, "One", 500).show();
    int act = action.getAction() & MotionEvent.ACTION_MASK;

            if(buttonPressed.getId()==B[0].getId())
            {
                 if(act == MotionEvent.ACTION_DOWN || act == MotionEvent.ACTION_POINTER_DOWN)
                    B[0].setImageDrawable(BPressed[0]);
                 if(act == MotionEvent.ACTION_UP || act == MotionEvent.ACTION_POINTER_UP)
                    B[0].setImageDrawable(BOk[0]);    
            }
            if(buttonPressed.getId()==B[1].getId())
            {
                 if(act == MotionEvent.ACTION_DOWN || act == MotionEvent.ACTION_POINTER_DOWN)
                    B[1].setImageDrawable(BPressed[1]);
                 if(act == MotionEvent.ACTION_UP || act == MotionEvent.ACTION_POINTER_UP)
                    B[1].setImageDrawable(BOk[1]);    
            }
            return true;
        }   
还有,祝酒辞:

if( buttonPressed.getId()==B[1].getId() )
         Toast.makeText(context, "One", 500).show();
如果我把手指放在B[0]上,就永远看不见了

掩蔽后:

有些事情改变了。假设我把手指放在B[0]上。在掩蔽之前,当我按下B[1]时,什么都没有发生。掩蔽后,如果我将手指保持在B[0]上,并在屏幕上的任何位置轻触手指,它将循环B[0]。因此,如果我去:

finger1_DOWN on B[0] it changes to Pressed drawable
while(1)
{
finger2_DOWN anywhere nothing changes
finger2_UP anywhere B[0] changes to Ok drawable
}
我在OnCreate中创建图像按钮:

B[0] = (ImageButton) findViewById(R.id.ImageButton05);
B[0].setOnTouchListener(this);
B[1] = (ImageButton) findViewById(R.id.ImageButton15);
B[1].setOnTouchListener(this);
我试过jboi的方法。我不在乎是第一次还是第二次按下按钮,所以我只是这样做:

private class MPListener implements OnTouchListener
    {
        @Override
        public boolean onTouch(View buttonPressed, MotionEvent event)
        {
            if(event.getAction() == MotionEvent.ACTION_DOWN)
            {
                if(buttonPressed.getId()==B[0].getId())
                   B[0].setImageDrawable(BPressed[0]);

                if(buttonPressed.getId()==B[1].getId())
                  B[1].setImageDrawable(BPressed[1]);
            }
            if(event.getAction() == MotionEvent.ACTION_UP)
            {
                if(buttonPressed.getId()==B[0].getId())
                   B[0].setImageDrawable(BOk[0]);

                if(buttonPressed.getId()==B[1].getId())
                  B[1].setImageDrawable(BOk[1]);
            }
        return true;
        }
    }
我从活动中删除了侦听器,并添加了

B[0].setOnTouchListener(new MPListener());
B[1].setOnTouchListener(new MPListener());
没有什么变化。我仍然可以单独按下两个按钮,但不能同时按下

编辑: 所以我做了一个新的活动,以防出现其他问题。以下是我的新活动的完整代码:

package com.example.projectname;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnTouchListener;
import android.widget.ImageView;

public class About extends Activity
{

    private class MPListener implements OnTouchListener 
    {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if(event.getAction() == MotionEvent.ACTION_UP) 
            {
                if(v.getId()==B[0].getId())
                    B[0].setImageDrawable(Bok[0]);
                if(v.getId()==B[1].getId())
                    B[1].setImageDrawable(Bok[1]);
            }
            else if(event.getAction() == MotionEvent.ACTION_DOWN) 
            {
                if(v.getId()==B[0].getId())
                    B[0].setImageDrawable(Bpressed[0]);
                if(v.getId()==B[1].getId())
                    B[1].setImageDrawable(Bpressed[1]);
            }
            return true;
        }
    }

    ImageView[] B;
    Drawable[] Bok,Bpressed;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        //standard oncreate stuff
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_about);

        Context context=getApplicationContext();

        B=new ImageView[2];
        Bok=new Drawable[2];
        Bpressed=new Drawable[2];

        Bok[0] = context.getResources().getDrawable(R.drawable.bblue);
        Bok[1] = context.getResources().getDrawable(R.drawable.bpurp);
        Bpressed[0] = context.getResources().getDrawable(R.drawable.bpressedblue);
        Bpressed[1] = context.getResources().getDrawable(R.drawable.bpressedpurp);

        B[0] = (ImageView) findViewById(R.id.imageView1);
        B[1] = (ImageView) findViewById(R.id.imageView2);
        B[0].setImageDrawable(Bok[0]);
        B[1].setImageDrawable(Bok[1]);

        B[0].setOnTouchListener(new MPListener());
        B[1].setOnTouchListener(new MPListener());
    }
}

一切都和往常一样。我一按一个按钮,另一个就没有反应

安卓可以帮你分类,按什么顺序按下了什么,是否仍在触摸。只需将两个按钮设置为不同的侦听器即可。类似于以下代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    Log.d("TEST", "Begin onCreate");
    super.onCreate(savedInstanceState);
    Log.d("TEST", "End   onCreate");

    setContentView(R.layout.test);
    findViewById(R.id.upperTouchable).setOnTouchListener(new MyTouchListener());
    findViewById(R.id.lowerTouchable).setOnTouchListener(new MyTouchListener());
}

private boolean lowerIsTouched = false;
private boolean upperIsTouched = false;

private void setInfo() {
    if(lowerIsTouched && upperIsTouched)
        ((TextView) findViewById(R.id.info)).setText("both touched");
    else if(lowerIsTouched)
        ((TextView) findViewById(R.id.info)).setText("only lower is touched");
    else if(upperIsTouched)
        ((TextView) findViewById(R.id.info)).setText("only upper is touched");
    else
        ((TextView) findViewById(R.id.info)).setText("non is touched");

    ((TextView) findViewById(R.id.lowerTouchable)).setText(lowerIsTouched? "touched":"not touched");
    ((TextView) findViewById(R.id.upperTouchable)).setText(upperIsTouched? "touched":"not touched");
}

private class MyTouchListener implements OnTouchListener {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_DOWN) {
            if(v.getId() == R.id.lowerTouchable)
                lowerIsTouched = true;
            else if(v.getId() == R.id.upperTouchable)
                upperIsTouched = true;
            setInfo();
        }
        else if(event.getAction() == MotionEvent.ACTION_UP) {
            if(v.getId() == R.id.lowerTouchable)
                lowerIsTouched = false;
            else if(v.getId() == R.id.upperTouchable)
                upperIsTouched = false;
            setInfo();
        }
        return true;
    }
}
以及相应的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<TextView
    android:id="@+id/info"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:background="#FFFFFFFF"
android:text="Non touched"
    android:textAppearance="?android:attr/textAppearanceLarge" />

<TextView
    android:id="@+id/upperTouchable"
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:gravity="center"
    android:text="Not touched"
    android:background="#FFF0F0F0"
    android:textAppearance="?android:attr/textAppearanceLarge" />

<TextView
    android:id="@+id/lowerTouchable"
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:gravity="center"
    android:text="Not touched"
    android:background="#FFFFFFFF"
    android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>


很明显,如果先触摸B[0](未释放),然后触摸B[1],这意味着B[1]将获得
动作指针向下
事件,因为这是第二次触摸。你应该像检查B[0]一样,为B[1]添加检查
操作\u指针\u向下
。@Stan-Oh,这只是一个输入错误。当我修好它时,它仍然不起作用。另外,它也不起作用(B[1]>B[0])应用掩码后,应该检查操作:
if(event.getAction()&MotionEvent.action\u mask==…)
。它仍然不起作用,请查看我的编辑。尝试返回false。此外,这可能与您的容器视图有关。提供一些关于它的信息。我做了编辑,检查一下。我将尝试修改您的代码,看看它是否可以工作。我在代码中添加了动作指针,而您的方法似乎没有任何改变。这与我在类中直接实现侦听器时相同。如果看到您的编辑。我想我还是不完全明白,你到底在寻找什么样的行为。让我用我的话解释一下:一个按钮可以有三种状态:“未按下”、“按下”、“无响应”。屏幕上有两个按钮。最初,两个按钮都处于“未按下”状态。如果按下一个按钮,则该按钮进入“按下”状态,另一个按钮进入“无响应”状态。如果现在触摸另一个按钮,它不会做出反应。如果松开第一个按钮,两个按钮都将变为“未按下”。这样行吗?如果,那么我可以更改我的代码,以完成该操作。让我知道。好吧,那不是我想要的。我想要两个按钮,两个都能响应。两个按钮都可以按下或不按下。你所描述的正是我得到的。但那不是我需要的。我不想要没有反应的按钮。我希望我说得很清楚,谢谢:)我只是在清理我的测试来发布它,并且有了一个提前测试的想法。您使用的是什么视图类型?这些是文本视图还是按钮?对于按钮,图像可能与按钮本身的单击逻辑重叠。您能用文本视图或普通图像视图进行测试吗?如果这仍然不起作用,我在这里发布ky完整的测试代码。不知何故,我们应该让它工作起来。多点触控支持是通过API级别8,Android 2.2添加的。