Android 当手指移动时,触控式监听器不会释放按钮

Android 当手指移动时,触控式监听器不会释放按钮,android,button,move,ontouchlistener,Android,Button,Move,Ontouchlistener,我有一个带有15个按钮的RelativeLayout,我正在做一个新项目,我希望我的应用程序可以这样做:当用户触摸例如按钮1时,Mp1将开始播放,直到用户抬起手指或将其移动到按钮2,然后按钮2上的mp2应该启动,依此类推 但这里是发生的情况,用户触摸屏幕时,升降机工作正常,但如果用户移动手指(而不是提升),如果按下按钮1,它仍将处于按下状态(向下操作),直到用户抬起手指。 大概是这样的: 我的问题: 当手指离开按钮边框以停止按钮并打开按下的按钮(手指触摸的位置)时,我需要添加什么? 我的代码:

我有一个带有15个按钮的
RelativeLayout
,我正在做一个新项目,我希望我的应用程序可以这样做:当用户触摸例如按钮1时,Mp1将开始播放,直到用户抬起手指或将其移动到按钮2,然后按钮2上的mp2应该启动,依此类推

但这里是发生的情况,用户触摸屏幕时,升降机工作正常,但如果用户移动手指(而不是提升),如果按下按钮1,它仍将处于按下状态(向下操作),直到用户抬起手指。 大概是这样的:

我的问题:

当手指离开按钮边框以停止按钮并打开按下的按钮(手指触摸的位置)时,我需要添加什么? 我的代码:

试试这个:

sound1.setOnTouchListener(new OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) {
                    pressed1 = true;
                    mp1 = MediaPlayer.create(MainClass.this, R.raw.item1);
                    mp1.start();
                    sound1.setBackgroundResource(R.drawable.pad_pressed);
                    if (looping == true) {
                        mp1.setLooping(true);
                    } else if (looping == false) {
                        mp1.setLooping(false);
                    }

                } else if (event.getAction() == android.view.MotionEvent.ACTION_UP || event.getAction() == android.view.MotionEvent.ACTION_CANCEL) {
                    pressed1 = false;
                    mp1.stop();
                    mp1.reset();
                    mp1.release();
                    sound1.setBackgroundResource(R.drawable.pad_normal);
                }
                return true;
            }
        });

ACTION\u CANCEL
在父对象控制运动时发生。你可以找到更多关于
运动事件的信息

你必须关注相对性

MyActivity.java

public class MyActivity extends Activity {

private RelativeLayout mainLayout;
private TextView myTag;
private TextView xcordview;
private TextView ycordview;

private MediaPlayer mp1;
private String currentTag;
private boolean areaDetected;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my);
    mainLayout = (RelativeLayout) findViewById(R.id.main_layout);
    myTag = (TextView) findViewById(R.id.tag);
    xcordview = (TextView) findViewById(R.id.x_view);
    ycordview = (TextView) findViewById(R.id.y_view);
    currentTag = "";
    initEvent();
}

private void initEvent() {
    mainLayout.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {

            int x = (int) motionEvent.getX();
            int y = (int) motionEvent.getY();

            xcordview.setText("X : " + String.valueOf(x));
            ycordview.setText("Y : " + String.valueOf(y));

            areaDetected = false;
            for (int i = 0; i < mainLayout.getChildCount(); i++) {
                View currentButton = mainLayout.getChildAt(i);
                if (currentButton instanceof Button) {
                    Button b = (Button) currentButton;
                    String tag = b.getTag().toString();

                    if (!pointInside(x, y, b.getLeft(), b.getRight(), b.getTop(), b.getBottom())) {
                        b.setText("");
                        // b.setBackgroundResource(getResources().getColor(android.R.color.black));
                    } else {
                        areaDetected = true;
                        if (!currentTag.equals(tag)) {
                            currentTag = tag;
                            stopPlaying();
                            b.setText(tag);
                            mp1 = getMediaPlayer(tag);
                            mp1.start();
                            // b.setBackgroundResource(getResources().getColor(android.R.color.white));
                        }
                    }
                }
            }
            if (!areaDetected) {
                currentTag = "";
                stopPlaying();
            }
            myTag.setText("Current tag : " + currentTag);
            return true;
        }
    });
}

private void stopPlaying() {
    if (mp1 != null) {
        mp1.stop();
        mp1.release();
        mp1 = null;
    }
}

private MediaPlayer getMediaPlayer(String tag) {
    if (tag.equals("b1")) {
        return MediaPlayer.create(MyActivity.this, R.raw.coffee_and_snow);
    }
    return MediaPlayer.create(MyActivity.this, R.raw.coffee_and_snow2);
}

static boolean pointInside(int x, int y, int x1, int x2, int y1, int y2) {
    return (x <= x2 && x >= x1 && y <= y2 && y >= y1);
}
}

非常感谢这篇文章==>

您可以检查事件是否在视图中,或者是否未使用View.getLocationOnScreen(),它不会帮助您触发单击另一个按钮,但它至少可以停止对上一个按钮的单击。您可以在按钮所在的位置发布xml吗是的,这正在工作,但有一件事是这样的。我以前从未在派生类中使用过OnTouchEvent,我应该如何使用OnTouchEvent?我在哪里可以设置按钮ID,我尝试了所有我认为无效的方法。你需要
onTouchEvent
?在这里,此事件被禁用,因为它与RelativeLayout中的onTouch冲突。那么,我还可以如何设置使这些按钮执行某些操作?我应该用什么?我想你可以玩按钮上的标签。我已经更新了我的答案。如果你按下或点击b1,你有一首歌。通过滑动到另一个按钮,新歌曲开始。如果您移动到该区域之外,歌曲将停止。
sound1.setOnTouchListener(new OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) {
                    pressed1 = true;
                    mp1 = MediaPlayer.create(MainClass.this, R.raw.item1);
                    mp1.start();
                    sound1.setBackgroundResource(R.drawable.pad_pressed);
                    if (looping == true) {
                        mp1.setLooping(true);
                    } else if (looping == false) {
                        mp1.setLooping(false);
                    }

                } else if (event.getAction() == android.view.MotionEvent.ACTION_UP || event.getAction() == android.view.MotionEvent.ACTION_CANCEL) {
                    pressed1 = false;
                    mp1.stop();
                    mp1.reset();
                    mp1.release();
                    sound1.setBackgroundResource(R.drawable.pad_normal);
                }
                return true;
            }
        });
public class MyActivity extends Activity {

private RelativeLayout mainLayout;
private TextView myTag;
private TextView xcordview;
private TextView ycordview;

private MediaPlayer mp1;
private String currentTag;
private boolean areaDetected;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my);
    mainLayout = (RelativeLayout) findViewById(R.id.main_layout);
    myTag = (TextView) findViewById(R.id.tag);
    xcordview = (TextView) findViewById(R.id.x_view);
    ycordview = (TextView) findViewById(R.id.y_view);
    currentTag = "";
    initEvent();
}

private void initEvent() {
    mainLayout.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {

            int x = (int) motionEvent.getX();
            int y = (int) motionEvent.getY();

            xcordview.setText("X : " + String.valueOf(x));
            ycordview.setText("Y : " + String.valueOf(y));

            areaDetected = false;
            for (int i = 0; i < mainLayout.getChildCount(); i++) {
                View currentButton = mainLayout.getChildAt(i);
                if (currentButton instanceof Button) {
                    Button b = (Button) currentButton;
                    String tag = b.getTag().toString();

                    if (!pointInside(x, y, b.getLeft(), b.getRight(), b.getTop(), b.getBottom())) {
                        b.setText("");
                        // b.setBackgroundResource(getResources().getColor(android.R.color.black));
                    } else {
                        areaDetected = true;
                        if (!currentTag.equals(tag)) {
                            currentTag = tag;
                            stopPlaying();
                            b.setText(tag);
                            mp1 = getMediaPlayer(tag);
                            mp1.start();
                            // b.setBackgroundResource(getResources().getColor(android.R.color.white));
                        }
                    }
                }
            }
            if (!areaDetected) {
                currentTag = "";
                stopPlaying();
            }
            myTag.setText("Current tag : " + currentTag);
            return true;
        }
    });
}

private void stopPlaying() {
    if (mp1 != null) {
        mp1.stop();
        mp1.release();
        mp1 = null;
    }
}

private MediaPlayer getMediaPlayer(String tag) {
    if (tag.equals("b1")) {
        return MediaPlayer.create(MyActivity.this, R.raw.coffee_and_snow);
    }
    return MediaPlayer.create(MyActivity.this, R.raw.coffee_and_snow2);
}

static boolean pointInside(int x, int y, int x1, int x2, int y1, int y2) {
    return (x <= x2 && x >= x1 && y <= y2 && y >= y1);
}
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MyActivity">

    <com.example.antoine.touchtest.MyButton
        android:id="@+id/b1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:tag="b1" />

    <com.example.antoine.touchtest.MyButton
        android:id="@+id/b2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/b1"
        android:tag="b2" />

    <com.example.antoine.touchtest.MyButton
        android:id="@+id/b3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/b2"
        android:tag="b3" />

    <com.example.antoine.touchtest.MyButton
        android:id="@+id/b4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/b3"
        android:tag="b4" />

    <TextView
        android:id="@+id/x_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/y_view"
        android:text="X : " />

    <TextView
        android:id="@+id/tag"
        android:layout_above="@+id/x_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Current tag : " />

    <TextView
        android:id="@+id/y_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:text="Y : " />
</RelativeLayout>
public class MyButton extends Button {

    public MyButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // TODO Auto-generated constructor stub
    }

    public MyButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    public MyButton(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        // return super.onTouchEvent(event);
        return false;
    }

}