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